How to use install method in Airtest

Best Python code snippet using Airtest

test_install.js

Source:test_install.js Github

copy

Full Screen

...85            "onInstallEnded",86          ], function() {87            check_test_1(install.addon.syncGUID);88          });89          install.install();90        });91      });92    });93  });94}95function check_test_1(installSyncGUID) {96  ensure_test_completed();97  AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) {98    do_check_eq(olda1, null);99    AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(async function(pendingAddons) {100      do_check_eq(pendingAddons.length, 1);101      do_check_eq(pendingAddons[0].id, "addon1@tests.mozilla.org");102      let uri = NetUtil.newURI(pendingAddons[0].iconURL);103      if (uri instanceof AM_Ci.nsIJARURI) {104        let jarURI = uri.QueryInterface(AM_Ci.nsIJARURI);105        let archiveURI = jarURI.JARFile;106        let archiveFile = archiveURI.QueryInterface(AM_Ci.nsIFileURL).file;107        let zipReader = Cc["@mozilla.org/libjar/zip-reader;1"].108                        createInstance(Ci.nsIZipReader);109        try {110          zipReader.open(archiveFile);111          do_check_true(zipReader.hasEntry(jarURI.JAREntry));112        } finally {113          zipReader.close();114        }115      } else {116        let iconFile = uri.QueryInterface(AM_Ci.nsIFileURL).file;117        do_check_true(iconFile.exists());118        // Make the iconFile predictably old.119        iconFile.lastModifiedTime = Date.now() - MAKE_FILE_OLD_DIFFERENCE;120      }121      // Make the pending install have a sensible date122      let updateDate = Date.now();123      let extURI = pendingAddons[0].getResourceURI("");124      let ext = extURI.QueryInterface(AM_Ci.nsIFileURL).file;125      setExtensionModifiedTime(ext, updateDate);126      // The pending add-on cannot be disabled or enabled.127      do_check_false(hasFlag(pendingAddons[0].permissions, AddonManager.PERM_CAN_ENABLE));128      do_check_false(hasFlag(pendingAddons[0].permissions, AddonManager.PERM_CAN_DISABLE));129      await promiseRestartManager();130      AddonManager.getAllInstalls(function(activeInstalls) {131        do_check_eq(activeInstalls, 0);132        AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {133          do_check_neq(a1, null);134          do_check_neq(a1.syncGUID, null);135          do_check_true(a1.syncGUID.length >= 9);136          do_check_eq(a1.syncGUID, installSyncGUID);137          do_check_eq(a1.type, "extension");138          do_check_eq(a1.version, "1.0");139          do_check_eq(a1.name, "Test 1");140          do_check_true(isExtensionInAddonsList(profileDir, a1.id));141          do_check_true(do_get_addon("test_install1").exists());142          do_check_in_crash_annotation(a1.id, a1.version);143          do_check_eq(a1.size, ADDON1_SIZE);144          do_check_false(a1.foreignInstall);145          do_check_eq(a1.sourceURI.spec,146                      Services.io.newFileURI(do_get_addon("test_install1")).spec);147          let difference = a1.installDate.getTime() - updateDate;148          if (Math.abs(difference) > MAX_TIME_DIFFERENCE)149            do_throw("Add-on install time was out by " + difference + "ms");150          difference = a1.updateDate.getTime() - updateDate;151          if (Math.abs(difference) > MAX_TIME_DIFFERENCE)152            do_throw("Add-on update time was out by " + difference + "ms");153          do_check_true(a1.hasResource("install.rdf"));154          do_check_false(a1.hasResource("foo.bar"));155          let uri2 = do_get_addon_root_uri(profileDir, "addon1@tests.mozilla.org");156          do_check_eq(a1.getResourceURI("install.rdf").spec, uri2 + "install.rdf");157          do_check_eq(a1.iconURL, uri2 + "icon.png");158          do_check_eq(a1.icon64URL, uri2 + "icon64.png");159          // Ensure that extension bundle (or icon if unpacked) has updated160          // lastModifiedDate.161          let testURI = a1.getResourceURI(TEST_UNPACKED ? "icon.png" : "");162          let testFile = testURI.QueryInterface(Components.interfaces.nsIFileURL).file;163          do_check_true(testFile.exists());164          difference = testFile.lastModifiedTime - Date.now();165          do_check_true(Math.abs(difference) < MAX_TIME_DIFFERENCE);166          a1.uninstall();167          let { id, version } = a1;168          restartManager();169          do_check_not_in_crash_annotation(id, version);170          do_execute_soon(run_test_2);171        }));172      });173    }));174  });175}176// Tests that an install from a url downloads.177function run_test_2() {178  let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi";179  AddonManager.getInstallForURL(url, function(install) {180    do_check_neq(install, null);181    do_check_eq(install.version, "1.0");182    do_check_eq(install.name, "Test 2");183    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);184    do_check_eq(install.iconURL, null);185    do_check_eq(install.sourceURI.spec, url);186    AddonManager.getAllInstalls(function(activeInstalls) {187      do_check_eq(activeInstalls.length, 1);188      do_check_eq(activeInstalls[0], install);189      prepare_test({}, [190        "onDownloadStarted",191        "onDownloadEnded",192      ], check_test_2);193      install.addListener({194        onDownloadProgress() {195          do_execute_soon(function() {196            Components.utils.forceGC();197          });198        }199      });200      install.install();201    });202  }, "application/x-xpinstall", null, "Test 2", null, "1.0");203}204function check_test_2(install) {205  ensure_test_completed();206  do_check_eq(install.version, "2.0");207  do_check_eq(install.name, "Real Test 2");208  do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);209  do_check_eq(install.addon.install, install);210  do_check_true(hasFlag(install.addon.operationsRequiringRestart,211                        AddonManager.OP_NEEDS_RESTART_INSTALL));212  do_check_eq(install.iconURL, null);213  // Pause the install here and start it again in run_test_3214  do_execute_soon(function() { run_test_3(install); });215  return false;216}217// Tests that the downloaded XPI installs ok218function run_test_3(install) {219  prepare_test({220    "addon2@tests.mozilla.org": [221      "onInstalling"222    ]223  }, [224    "onInstallStarted",225    "onInstallEnded",226  ], check_test_3);227  install.install();228}229function check_test_3(aInstall) {230  // Make the pending install have a sensible date231  let updateDate = Date.now();232  let extURI = aInstall.addon.getResourceURI("");233  let ext = extURI.QueryInterface(AM_Ci.nsIFileURL).file;234  setExtensionModifiedTime(ext, updateDate);235  ensure_test_completed();236  AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(async function(olda2) {237    do_check_eq(olda2, null);238    await promiseRestartManager();239    AddonManager.getAllInstalls(function(installs) {240      do_check_eq(installs, 0);241      AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {242        do_check_neq(a2, null);243        do_check_neq(a2.syncGUID, null);244        do_check_eq(a2.type, "extension");245        do_check_eq(a2.version, "2.0");246        do_check_eq(a2.name, "Real Test 2");247        do_check_true(isExtensionInAddonsList(profileDir, a2.id));248        do_check_true(do_get_addon("test_install2_1").exists());249        do_check_in_crash_annotation(a2.id, a2.version);250        do_check_eq(a2.sourceURI.spec,251                    "http://localhost:" + gPort + "/addons/test_install2_1.xpi");252        let difference = a2.installDate.getTime() - updateDate;253        if (Math.abs(difference) > MAX_TIME_DIFFERENCE)254          do_throw("Add-on install time was out by " + difference + "ms");255        difference = a2.updateDate.getTime() - updateDate;256        if (Math.abs(difference) > MAX_TIME_DIFFERENCE)257          do_throw("Add-on update time was out by " + difference + "ms");258        gInstallDate = a2.installDate.getTime();259        run_test_4();260      });261    });262  }));263}264// Tests that installing a new version of an existing add-on works265function run_test_4() {266  prepare_test({ }, [267    "onNewInstall"268  ]);269  let url = "http://localhost:" + gPort + "/addons/test_install2_2.xpi";270  AddonManager.getInstallForURL(url, function(install) {271    ensure_test_completed();272    do_check_neq(install, null);273    do_check_eq(install.version, "3.0");274    do_check_eq(install.name, "Test 3");275    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);276    AddonManager.getAllInstalls(function(activeInstalls) {277      do_check_eq(activeInstalls.length, 1);278      do_check_eq(activeInstalls[0], install);279      do_check_eq(install.existingAddon, null);280      prepare_test({}, [281        "onDownloadStarted",282        "onDownloadEnded",283      ], check_test_4);284      install.install();285    });286  }, "application/x-xpinstall", null, "Test 3", null, "3.0");287}288function check_test_4(install) {289  ensure_test_completed();290  do_check_eq(install.version, "3.0");291  do_check_eq(install.name, "Real Test 3");292  do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);293  do_check_neq(install.existingAddon);294  do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org");295  do_check_eq(install.addon.install, install);296  do_check_true(hasFlag(install.addon.operationsRequiringRestart,297                        AddonManager.OP_NEEDS_RESTART_INSTALL));298  run_test_5();299  // Installation will continue when there is nothing returned.300}301// Continue installing the new version302function run_test_5() {303  prepare_test({304    "addon2@tests.mozilla.org": [305      "onInstalling"306    ]307  }, [308    "onInstallStarted",309    "onInstallEnded",310  ], check_test_5);311}312function check_test_5(install) {313  ensure_test_completed();314  do_check_eq(install.existingAddon.pendingUpgrade.install, install);315  AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) {316    do_check_neq(olda2, null);317    do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));318    AddonManager.getInstallsByTypes(null, callback_soon(function(installs) {319      do_check_eq(installs.length, 1);320      do_check_eq(installs[0].addon, olda2.pendingUpgrade);321      restartManager();322      AddonManager.getInstallsByTypes(null, function(installs2) {323        do_check_eq(installs2.length, 0);324        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {325          do_check_neq(a2, null);326          do_check_eq(a2.type, "extension");327          do_check_eq(a2.version, "3.0");328          do_check_eq(a2.name, "Real Test 3");329          do_check_true(a2.isActive);330          do_check_true(isExtensionInAddonsList(profileDir, a2.id));331          do_check_true(do_get_addon("test_install2_2").exists());332          do_check_in_crash_annotation(a2.id, a2.version);333          do_check_eq(a2.sourceURI.spec,334                      "http://localhost:" + gPort + "/addons/test_install2_2.xpi");335          do_check_false(a2.foreignInstall);336          do_check_eq(a2.installDate.getTime(), gInstallDate);337          // Update date should be later (or the same if this test is too fast)338          do_check_true(a2.installDate <= a2.updateDate);339          a2.uninstall();340          do_execute_soon(run_test_6);341        });342      });343    }));344  });345}346// Tests that an install that requires a compatibility update works347function run_test_6() {348  restartManager();349  prepare_test({ }, [350    "onNewInstall"351  ]);352  let url = "http://localhost:" + gPort + "/addons/test_install3.xpi";353  AddonManager.getInstallForURL(url, function(install) {354    ensure_test_completed();355    do_check_neq(install, null);356    do_check_eq(install.version, "1.0");357    do_check_eq(install.name, "Real Test 4");358    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);359    AddonManager.getInstallsByTypes(null, function(activeInstalls) {360      do_check_eq(activeInstalls.length, 1);361      do_check_eq(activeInstalls[0], install);362      prepare_test({}, [363        "onDownloadStarted",364        "onDownloadEnded",365      ], check_test_6);366      install.install();367    });368  }, "application/x-xpinstall", null, "Real Test 4", null, "1.0");369}370function check_test_6(install) {371  ensure_test_completed();372  do_check_eq(install.version, "1.0");373  do_check_eq(install.name, "Real Test 4");374  do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);375  do_check_eq(install.existingAddon, null);376  do_check_false(install.addon.appDisabled);377  run_test_7();378  return true;379}380// Continue the install381function run_test_7() {382  prepare_test({383    "addon3@tests.mozilla.org": [384      "onInstalling"385    ]386  }, [387    "onInstallStarted",388    "onInstallEnded",389  ], check_test_7);390}391function check_test_7() {392  ensure_test_completed();393  AddonManager.getAddonByID("addon3@tests.mozilla.org", callback_soon(async function(olda3) {394    do_check_eq(olda3, null);395    await promiseRestartManager();396    AddonManager.getAllInstalls(function(installs) {397      do_check_eq(installs, 0);398      AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {399        do_check_neq(a3, null);400        do_check_neq(a3.syncGUID, null);401        do_check_eq(a3.type, "extension");402        do_check_eq(a3.version, "1.0");403        do_check_eq(a3.name, "Real Test 4");404        do_check_true(a3.isActive);405        do_check_false(a3.appDisabled);406        do_check_true(isExtensionInAddonsList(profileDir, a3.id));407        do_check_true(do_get_addon("test_install3").exists());408        a3.uninstall();409        do_execute_soon(run_test_8);410      });411    });412  }));413}414function run_test_8() {415  restartManager();416  AddonManager.addInstallListener(InstallListener);417  AddonManager.addAddonListener(AddonListener);418  prepare_test({ }, [419    "onNewInstall"420  ]);421  AddonManager.getInstallForFile(do_get_addon("test_install3"), function(install) {422    do_check_true(install.addon.isCompatible);423    prepare_test({424      "addon3@tests.mozilla.org": [425        "onInstalling"426      ]427    }, [428      "onInstallStarted",429      "onInstallEnded",430    ], callback_soon(check_test_8));431    install.install();432  });433}434async function check_test_8() {435  await promiseRestartManager();436  AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {437    do_check_neq(a3, null);438    do_check_neq(a3.syncGUID, null);439    do_check_eq(a3.type, "extension");440    do_check_eq(a3.version, "1.0");441    do_check_eq(a3.name, "Real Test 4");442    do_check_true(a3.isActive);443    do_check_false(a3.appDisabled);444    do_check_true(isExtensionInAddonsList(profileDir, a3.id));445    do_check_true(do_get_addon("test_install3").exists());446    a3.uninstall();447    do_execute_soon(run_test_9);448  });449}450// Test that after cancelling a download it is removed from the active installs451function run_test_9() {452  restartManager();453  prepare_test({ }, [454    "onNewInstall"455  ]);456  let url = "http://localhost:" + gPort + "/addons/test_install3.xpi";457  AddonManager.getInstallForURL(url, function(install) {458    ensure_test_completed();459    do_check_neq(install, null);460    do_check_eq(install.version, "1.0");461    do_check_eq(install.name, "Real Test 4");462    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);463    AddonManager.getInstallsByTypes(null, function(activeInstalls) {464      do_check_eq(activeInstalls.length, 1);465      do_check_eq(activeInstalls[0], install);466      prepare_test({}, [467        "onDownloadStarted",468        "onDownloadEnded",469      ], check_test_9);470      install.install();471    });472  }, "application/x-xpinstall", null, "Real Test 4", null, "1.0");473}474function check_test_9(install) {475  prepare_test({}, [476    "onDownloadCancelled"477  ], function() {478    let file = install.file;479    // Allow the file removal to complete480    do_execute_soon(function() {481      AddonManager.getAllInstalls(function(activeInstalls) {482        do_check_eq(activeInstalls.length, 0);483        do_check_false(file.exists());484        run_test_10();485      });486    });487  });488  install.cancel();489}490// Tests that after cancelling a pending install it is removed from the active491// installs492function run_test_10() {493  prepare_test({ }, [494    "onNewInstall"495  ]);496  let url = "http://localhost:" + gPort + "/addons/test_install3.xpi";497  AddonManager.getInstallForURL(url, function(install) {498    ensure_test_completed();499    do_check_neq(install, null);500    do_check_eq(install.version, "1.0");501    do_check_eq(install.name, "Real Test 4");502    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);503    AddonManager.getInstallsByTypes(null, function(activeInstalls) {504      do_check_eq(activeInstalls.length, 1);505      do_check_eq(activeInstalls[0], install);506      prepare_test({507        "addon3@tests.mozilla.org": [508          "onInstalling"509        ]510      }, [511        "onDownloadStarted",512        "onDownloadEnded",513        "onInstallStarted",514        "onInstallEnded"515      ], check_test_10);516      install.install();517    });518  }, "application/x-xpinstall", null, "Real Test 4", null, "1.0");519}520function check_test_10(install) {521  prepare_test({522    "addon3@tests.mozilla.org": [523      "onOperationCancelled"524    ]525  }, [526    "onInstallCancelled"527  ]);528  install.cancel();529  ensure_test_completed();530  AddonManager.getAllInstalls(callback_soon(function(activeInstalls) {531    do_check_eq(activeInstalls.length, 0);532    restartManager();533    // Check that the install did not complete534    AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {535      do_check_eq(a3, null);536      do_execute_soon(run_test_11);537    });538  }));539}540function run_test_11() {541  // Tests 11 and 12 were removed, to avoid churn of renumbering,542  // just jump ahead to 13 here543  run_test_13();544}545// Tests that cancelling an upgrade leaves the original add-on's pendingOperations546// correct547function run_test_13() {548  restartManager();549  installAllFiles([do_get_addon("test_install2_1")], function() {550    restartManager();551    prepare_test({ }, [552      "onNewInstall"553    ]);554    let url = "http://localhost:" + gPort + "/addons/test_install2_2.xpi";555    AddonManager.getInstallForURL(url, function(install) {556      ensure_test_completed();557      do_check_neq(install, null);558      do_check_eq(install.version, "3.0");559      do_check_eq(install.name, "Test 3");560      do_check_eq(install.state, AddonManager.STATE_AVAILABLE);561      AddonManager.getAllInstalls(function(activeInstalls) {562        do_check_eq(activeInstalls.length, 1);563        do_check_eq(activeInstalls[0], install);564        do_check_eq(install.existingAddon, null);565        prepare_test({566          "addon2@tests.mozilla.org": [567            "onInstalling"568          ]569        }, [570          "onDownloadStarted",571          "onDownloadEnded",572          "onInstallStarted",573          "onInstallEnded",574        ], check_test_13);575        install.install();576      });577    }, "application/x-xpinstall", null, "Test 3", null, "3.0");578  });579}580function check_test_13(install) {581  ensure_test_completed();582  do_check_eq(install.version, "3.0");583  do_check_eq(install.name, "Real Test 3");584  do_check_eq(install.state, AddonManager.STATE_INSTALLED);585  do_check_neq(install.existingAddon, null);586  do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org");587  do_check_eq(install.addon.install, install);588  AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) {589    do_check_neq(olda2, null);590    do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));591    do_check_eq(olda2.pendingUpgrade, install.addon);592    do_check_true(hasFlag(install.addon.pendingOperations,593                          AddonManager.PENDING_INSTALL));594    prepare_test({595      "addon2@tests.mozilla.org": [596        "onOperationCancelled"597      ]598    }, [599      "onInstallCancelled",600    ]);601    install.cancel();602    do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));603    do_check_false(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));604    do_check_eq(olda2.pendingUpgrade, null);605    restartManager();606    // Check that the upgrade did not complete607    AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {608      do_check_eq(a2.version, "2.0");609      a2.uninstall();610      do_execute_soon(run_test_14);611    });612  }));613}614// Check that cancelling the install from onDownloadStarted actually cancels it615function run_test_14() {616  restartManager();617  prepare_test({ }, [618    "onNewInstall"619  ]);620  let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi";621  AddonManager.getInstallForURL(url, function(install) {622    ensure_test_completed();623    do_check_eq(install.file, null);624    prepare_test({ }, [625      "onDownloadStarted"626    ], check_test_14);627    install.install();628  }, "application/x-xpinstall");629}630function check_test_14(install) {631  prepare_test({ }, [632    "onDownloadCancelled"633  ], function() {634    let file = install.file;635    install.addListener({636      onDownloadProgress() {637        do_throw("Download should not have continued");638      },639      onDownloadEnded() {640        do_throw("Download should not have continued");641      }642    });643    // Allow the listener to return to see if it continues downloading. The644    // The listener only really tests if we give it time to see progress, the645    // file check isn't ideal either646    do_execute_soon(function() {647      do_check_false(file.exists());648      run_test_15();649    });650  });651  // Wait for the channel to be ready to cancel652  do_execute_soon(function() {653    install.cancel();654  });655}656// Checks that cancelling the install from onDownloadEnded actually cancels it657function run_test_15() {658  prepare_test({ }, [659    "onNewInstall"660  ]);661  let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi";662  AddonManager.getInstallForURL(url, function(install) {663    ensure_test_completed();664    do_check_eq(install.file, null);665    prepare_test({ }, [666      "onDownloadStarted",667      "onDownloadEnded"668    ], check_test_15);669    install.install();670  }, "application/x-xpinstall");671}672function check_test_15(install) {673  prepare_test({ }, [674    "onDownloadCancelled"675  ]);676  install.cancel();677  ensure_test_completed();678  install.addListener({679    onInstallStarted() {680      do_throw("Install should not have continued");681    }682  });683  // Allow the listener to return to see if it starts installing684  do_execute_soon(run_test_16);685}686// Verify that the userDisabled value carries over to the upgrade by default687function run_test_16() {688  restartManager();689  let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi";690  AddonManager.getInstallForURL(url, function(aInstall) {691    aInstall.addListener({692      onInstallStarted() {693        do_check_false(aInstall.addon.userDisabled);694        aInstall.addon.userDisabled = true;695      },696      onInstallEnded() {697       do_execute_soon(function install2_1_ended() {698        restartManager();699        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {700          do_check_true(a2.userDisabled);701          do_check_false(a2.isActive);702          let url_2 = "http://localhost:" + gPort + "/addons/test_install2_2.xpi";703          AddonManager.getInstallForURL(url_2, function(aInstall_2) {704            aInstall_2.addListener({705              onInstallEnded() {706               do_execute_soon(function install2_2_ended() {707                do_check_true(aInstall_2.addon.userDisabled);708                restartManager();709                AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2_2) {710                  do_check_true(a2_2.userDisabled);711                  do_check_false(a2_2.isActive);712                  a2_2.uninstall();713                  do_execute_soon(run_test_17);714                });715               });716              }717            });718            aInstall_2.install();719          }, "application/x-xpinstall");720        });721       });722      }723    });724    aInstall.install();725  }, "application/x-xpinstall");726}727// Verify that changing the userDisabled value before onInstallEnded works728function run_test_17() {729  restartManager();730  let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi";731  AddonManager.getInstallForURL(url, function(aInstall) {732    aInstall.addListener({733      onInstallEnded() {734       do_execute_soon(function install2_1_ended2() {735        do_check_false(aInstall.addon.userDisabled);736        restartManager();737        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {738          do_check_false(a2.userDisabled);739          do_check_true(a2.isActive);740          let url_2 = "http://localhost:" + gPort + "/addons/test_install2_2.xpi";741          AddonManager.getInstallForURL(url_2, function(aInstall_2) {742            aInstall_2.addListener({743              onInstallStarted() {744                do_check_false(aInstall_2.addon.userDisabled);745                aInstall_2.addon.userDisabled = true;746              },747              onInstallEnded() {748               do_execute_soon(function install2_2_ended2() {749                restartManager();750                AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2_2) {751                  do_check_true(a2_2.userDisabled);752                  do_check_false(a2_2.isActive);753                  a2_2.uninstall();754                  do_execute_soon(run_test_18);755                });756               });757              }758            });759            aInstall_2.install();760          }, "application/x-xpinstall");761        });762       });763      }764    });765    aInstall.install();766  }, "application/x-xpinstall");767}768// Verify that changing the userDisabled value before onInstallEnded works769function run_test_18() {770  restartManager();771  let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi";772  AddonManager.getInstallForURL(url, function(aInstall) {773    aInstall.addListener({774      onInstallStarted() {775        do_check_false(aInstall.addon.userDisabled);776        aInstall.addon.userDisabled = true;777      },778      onInstallEnded() {779       do_execute_soon(function install_2_1_ended3() {780        restartManager();781        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {782          do_check_true(a2.userDisabled);783          do_check_false(a2.isActive);784          let url_2 = "http://localhost:" + gPort + "/addons/test_install2_2.xpi";785          AddonManager.getInstallForURL(url_2, function(aInstall_2) {786            aInstall_2.addListener({787              onInstallStarted() {788                do_check_true(aInstall_2.addon.userDisabled);789                aInstall_2.addon.userDisabled = false;790              },791              onInstallEnded() {792               do_execute_soon(function install_2_2_ended3() {793                restartManager();794                AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2_2) {795                  do_check_false(a2_2.userDisabled);796                  do_check_true(a2_2.isActive);797                  a2_2.uninstall();798                  do_execute_soon(run_test_18_1);799                });800               });801              }802            });803            aInstall_2.install();804          }, "application/x-xpinstall");805        });806       });807      }808    });809    aInstall.install();810  }, "application/x-xpinstall");811}812// Checks that metadata is not stored if the pref is set to false813function run_test_18_1() {814  restartManager();815  Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", true);816  Services.prefs.setCharPref(PREF_GETADDONS_BYIDS,817                             "http://localhost:" + gPort + "/data/test_install.xml");818  Services.prefs.setBoolPref("extensions.addon2@tests.mozilla.org.getAddons.cache.enabled", false);819  let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi";820  AddonManager.getInstallForURL(url, function(aInstall) {821    aInstall.addListener({822      onInstallEnded(unused, aAddon) {823       do_execute_soon(function test18_1_install_ended() {824        do_check_neq(aAddon.fullDescription, "Repository description");825        restartManager();826        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {827          do_check_neq(a2.fullDescription, "Repository description");828          a2.uninstall();829          do_execute_soon(run_test_19);830        });831       });832      }833    });834    aInstall.install();835  }, "application/x-xpinstall");836}837// Checks that metadata is downloaded for new installs and is visible before and838// after restart839function run_test_19() {840  restartManager();841  Services.prefs.setBoolPref("extensions.addon2@tests.mozilla.org.getAddons.cache.enabled", true);842  let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi";843  AddonManager.getInstallForURL(url, function(aInstall) {844    aInstall.addListener({845      onInstallEnded(unused, aAddon) {846       do_execute_soon(function test19_install_ended() {847        do_check_eq(aAddon.fullDescription, "Repository description");848        restartManager();849        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {850          do_check_eq(a2.fullDescription, "Repository description");851          a2.uninstall();852          do_execute_soon(run_test_20);853        });854       });855      }856    });857    aInstall.install();858  }, "application/x-xpinstall");859}860// Do the same again to make sure it works when the data is already in the cache861function run_test_20() {862  restartManager();863  let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi";864  AddonManager.getInstallForURL(url, function(aInstall) {865    aInstall.addListener({866      onInstallEnded(unused, aAddon) {867       do_execute_soon(function test20_install_ended() {868        do_check_eq(aAddon.fullDescription, "Repository description");869        restartManager();870        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {871          do_check_eq(a2.fullDescription, "Repository description");872          a2.uninstall();873          do_execute_soon(run_test_21);874        });875       });876      }877    });878    aInstall.install();879  }, "application/x-xpinstall");880}881// Verify that installing an add-on that is already pending install cancels the882// first install883function run_test_21() {884  restartManager();885  Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", false);886  installAllFiles([do_get_addon("test_install2_1")], function() {887    AddonManager.getAllInstalls(function(aInstalls) {888      do_check_eq(aInstalls.length, 1);889      prepare_test({890        "addon2@tests.mozilla.org": [891          "onOperationCancelled",892          "onInstalling"893        ]894      }, [895        "onNewInstall",896        "onDownloadStarted",897        "onDownloadEnded",898        "onInstallStarted",899        "onInstallCancelled",900        "onInstallEnded",901      ], check_test_21);902      let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi";903      AddonManager.getInstallForURL(url, function(aInstall) {904        aInstall.install();905      }, "application/x-xpinstall");906    });907  });908}909function check_test_21(aInstall) {910  AddonManager.getAllInstalls(callback_soon(function(aInstalls) {911    do_check_eq(aInstalls.length, 1);912    do_check_eq(aInstalls[0], aInstall);913    prepare_test({914      "addon2@tests.mozilla.org": [915        "onOperationCancelled"916      ]917    }, [918      "onInstallCancelled",919    ]);920    aInstall.cancel();921    ensure_test_completed();922    restartManager();923    AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {924      do_check_eq(a2, null);925      run_test_22();926    });927  }));928}929// Tests that an install can be restarted after being cancelled930function run_test_22() {931  prepare_test({ }, [932    "onNewInstall"933  ]);934  let url = "http://localhost:" + gPort + "/addons/test_install3.xpi";935  AddonManager.getInstallForURL(url, function(aInstall) {936    ensure_test_completed();937    do_check_neq(aInstall, null);938    do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);939    prepare_test({}, [940      "onDownloadStarted",941      "onDownloadEnded",942    ], check_test_22);943    aInstall.install();944  }, "application/x-xpinstall");945}946function check_test_22(aInstall) {947  prepare_test({}, [948    "onDownloadCancelled"949  ]);950  aInstall.cancel();951  ensure_test_completed();952  prepare_test({953    "addon3@tests.mozilla.org": [954      "onInstalling"955    ]956  }, [957    "onDownloadStarted",958    "onDownloadEnded",959    "onInstallStarted",960    "onInstallEnded"961  ], finish_test_22);962  aInstall.install();963}964function finish_test_22(aInstall) {965  prepare_test({966    "addon3@tests.mozilla.org": [967      "onOperationCancelled"968    ]969  }, [970    "onInstallCancelled"971  ]);972  aInstall.cancel();973  ensure_test_completed();974  run_test_23();975}976// Tests that an install can be restarted after being cancelled when a hash977// was provided978function run_test_23() {979  prepare_test({ }, [980    "onNewInstall"981  ]);982  let url = "http://localhost:" + gPort + "/addons/test_install3.xpi";983  AddonManager.getInstallForURL(url, function(aInstall) {984    ensure_test_completed();985    do_check_neq(aInstall, null);986    do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);987    prepare_test({}, [988      "onDownloadStarted",989      "onDownloadEnded",990    ], check_test_23);991    aInstall.install();992  }, "application/x-xpinstall", do_get_addon_hash("test_install3"));993}994function check_test_23(aInstall) {995  prepare_test({}, [996    "onDownloadCancelled"997  ]);998  aInstall.cancel();999  ensure_test_completed();1000  prepare_test({1001    "addon3@tests.mozilla.org": [1002      "onInstalling"1003    ]1004  }, [1005    "onDownloadStarted",1006    "onDownloadEnded",1007    "onInstallStarted",1008    "onInstallEnded"1009  ], finish_test_23);1010  aInstall.install();1011}1012function finish_test_23(aInstall) {1013  prepare_test({1014    "addon3@tests.mozilla.org": [1015      "onOperationCancelled"1016    ]1017  }, [1018    "onInstallCancelled"1019  ]);1020  aInstall.cancel();1021  ensure_test_completed();1022  run_test_24();1023}1024// Tests that an install with a bad hash can be restarted after it fails, though1025// it will only fail again1026function run_test_24() {1027  prepare_test({ }, [1028    "onNewInstall"1029  ]);1030  let url = "http://localhost:" + gPort + "/addons/test_install3.xpi";1031  AddonManager.getInstallForURL(url, function(aInstall) {1032    ensure_test_completed();1033    do_check_neq(aInstall, null);1034    do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);1035    prepare_test({}, [1036      "onDownloadStarted",1037      "onDownloadFailed",1038    ], check_test_24);1039    aInstall.install();1040  }, "application/x-xpinstall", "sha1:foo");1041}1042function check_test_24(aInstall) {1043  prepare_test({ }, [1044    "onDownloadStarted",1045    "onDownloadFailed"1046  ], run_test_25);1047  aInstall.install();1048}1049// Tests that installs with a hash for a local file work1050function run_test_25() {1051  prepare_test({ }, [1052    "onNewInstall"1053  ]);1054  let url = Services.io.newFileURI(do_get_addon("test_install3")).spec;1055  AddonManager.getInstallForURL(url, function(aInstall) {1056    ensure_test_completed();1057    do_check_neq(aInstall, null);1058    do_check_eq(aInstall.state, AddonManager.STATE_DOWNLOADED);1059    do_check_eq(aInstall.error, 0);1060    prepare_test({ }, [1061      "onDownloadCancelled"1062    ]);1063    aInstall.cancel();1064    ensure_test_completed();1065    run_test_26();1066  }, "application/x-xpinstall", do_get_addon_hash("test_install3"));1067}1068function run_test_26() {1069  prepare_test({ }, [1070    "onNewInstall",1071    "onDownloadStarted",1072    "onDownloadCancelled"1073  ]);1074  let observerService = AM_Cc["@mozilla.org/network/http-activity-distributor;1"].1075                        getService(AM_Ci.nsIHttpActivityDistributor);1076  observerService.addObserver({1077    observeActivity(aChannel, aType, aSubtype, aTimestamp, aSizeData,1078                              aStringData) {1079      aChannel.QueryInterface(AM_Ci.nsIChannel);1080      // Wait for the final event for the redirected URL1081      if (aChannel.URI.spec != "http://localhost:" + gPort + "/addons/test_install1.xpi" ||1082          aType != AM_Ci.nsIHttpActivityObserver.ACTIVITY_TYPE_HTTP_TRANSACTION ||1083          aSubtype != AM_Ci.nsIHttpActivityObserver.ACTIVITY_SUBTYPE_TRANSACTION_CLOSE)1084        return;1085      // Request should have been cancelled1086      do_check_eq(aChannel.status, Components.results.NS_BINDING_ABORTED);1087      observerService.removeObserver(this);1088      run_test_27();1089    }1090  });1091  let url = "http://localhost:" + gPort + "/redirect?/addons/test_install1.xpi";1092  AddonManager.getInstallForURL(url, function(aInstall) {1093    aInstall.addListener({1094      onDownloadProgress(aDownloadProgressInstall) {1095        aDownloadProgressInstall.cancel();1096      }1097    });1098    aInstall.install();1099  }, "application/x-xpinstall");1100}1101// Tests that an install can be restarted during onDownloadCancelled after being1102// cancelled in mid-download1103function run_test_27() {1104  prepare_test({ }, [1105    "onNewInstall"1106  ]);1107  let url = "http://localhost:" + gPort + "/addons/test_install3.xpi";1108  AddonManager.getInstallForURL(url, function(aInstall) {1109    ensure_test_completed();1110    do_check_neq(aInstall, null);1111    do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);1112    aInstall.addListener({1113      onDownloadProgress() {1114        aInstall.removeListener(this);1115        aInstall.cancel();1116      }1117    });1118    prepare_test({}, [1119      "onDownloadStarted",1120      "onDownloadCancelled",1121    ], check_test_27);1122    aInstall.install();1123  }, "application/x-xpinstall");1124}1125function check_test_27(aInstall) {1126  prepare_test({1127    "addon3@tests.mozilla.org": [1128      "onInstalling"1129    ]1130  }, [1131    "onDownloadStarted",1132    "onDownloadEnded",1133    "onInstallStarted",1134    "onInstallEnded"1135  ], finish_test_27);1136  let file = aInstall.file;1137  aInstall.install();1138  do_check_neq(file.path, aInstall.file.path);1139  do_check_false(file.exists());1140}1141function finish_test_27(aInstall) {1142  prepare_test({1143    "addon3@tests.mozilla.org": [1144      "onOperationCancelled"1145    ]1146  }, [1147    "onInstallCancelled"1148  ]);1149  aInstall.cancel();1150  ensure_test_completed();1151  run_test_28();1152}1153// Tests that an install that isn't strictly compatible and has1154// binary components correctly has appDisabled set (see bug 702868).1155function run_test_28() {1156  prepare_test({ }, [1157    "onNewInstall"1158  ]);1159  let url = "http://localhost:" + gPort + "/addons/test_install5.xpi";1160  AddonManager.getInstallForURL(url, function(install) {1161    ensure_test_completed();1162    do_check_neq(install, null);1163    do_check_eq(install.version, "1.0");1164    do_check_eq(install.name, "Real Test 5");1165    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);1166    AddonManager.getInstallsByTypes(null, function(activeInstalls) {1167      do_check_eq(activeInstalls.length, 1);1168      do_check_eq(activeInstalls[0], install);1169      prepare_test({}, [1170        "onDownloadStarted",1171        "onDownloadEnded",1172        "onInstallStarted"1173      ], check_test_28);1174      install.install();1175    });1176  }, "application/x-xpinstall", null, "Real Test 5", null, "1.0");1177}1178function check_test_28(install) {1179  ensure_test_completed();1180  do_check_eq(install.version, "1.0");1181  do_check_eq(install.name, "Real Test 5");1182  do_check_eq(install.state, AddonManager.STATE_INSTALLING);1183  do_check_eq(install.existingAddon, null);1184  do_check_false(install.addon.isCompatible);1185  do_check_true(install.addon.appDisabled);1186  prepare_test({}, [1187    "onInstallCancelled"1188  ], finish_test_28);1189  return false;1190}1191function finish_test_28(install) {1192  prepare_test({}, [1193    "onDownloadCancelled"1194  ], run_test_29);1195  install.cancel();1196}1197// Tests that an install with a matching compatibility override has appDisabled1198// set correctly.1199function run_test_29() {1200  Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", true);1201  prepare_test({ }, [1202    "onNewInstall"1203  ]);1204  let url = "http://localhost:" + gPort + "/addons/test_install6.xpi";1205  AddonManager.getInstallForURL(url, function(install) {1206    ensure_test_completed();1207    do_check_neq(install, null);1208    do_check_eq(install.version, "1.0");1209    do_check_eq(install.name, "Addon Test 6");1210    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);1211    AddonManager.getInstallsByTypes(null, function(activeInstalls) {1212      do_check_eq(activeInstalls.length, 1);1213      do_check_eq(activeInstalls[0], install);1214      prepare_test({}, [1215        "onDownloadStarted",1216        "onDownloadEnded"1217      ], check_test_29);1218      install.install();1219    });1220  }, "application/x-xpinstall", null, "Addon Test 6", null, "1.0");1221}1222function check_test_29(install) {1223  // ensure_test_completed();1224  do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);1225  do_check_neq(install.addon, null);1226  do_check_false(install.addon.isCompatible);1227  do_check_true(install.addon.appDisabled);1228  prepare_test({}, [1229    "onDownloadCancelled"1230  ], run_test_30);1231  install.cancel();1232  return false;...

Full Screen

Full Screen

test_install_strictcompat.js

Source:test_install_strictcompat.js Github

copy

Full Screen

...81          }, [82            "onInstallStarted",83            "onInstallEnded",84          ], check_test_1);85          install.install();86        });87      });88    });89  });90}91function check_test_1() {92  ensure_test_completed();93  AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) {94    do_check_eq(olda1, null);95    AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(async function(pendingAddons) {96      do_check_eq(pendingAddons.length, 1);97      do_check_eq(pendingAddons[0].id, "addon1@tests.mozilla.org");98      let uri = NetUtil.newURI(pendingAddons[0].iconURL);99      if (uri instanceof AM_Ci.nsIJARURI) {100        let jarURI = uri.QueryInterface(AM_Ci.nsIJARURI);101        let archiveURI = jarURI.JARFile;102        let archiveFile = archiveURI.QueryInterface(AM_Ci.nsIFileURL).file;103        let zipReader = Cc["@mozilla.org/libjar/zip-reader;1"].104                        createInstance(Ci.nsIZipReader);105        try {106          zipReader.open(archiveFile);107          do_check_true(zipReader.hasEntry(jarURI.JAREntry));108        } finally {109          zipReader.close();110        }111      } else {112        let iconFile = uri.QueryInterface(AM_Ci.nsIFileURL).file;113        do_check_true(iconFile.exists());114      }115      // Make the pending install have a sensible date116      let updateDate = Date.now();117      let extURI = pendingAddons[0].getResourceURI("");118      let ext = extURI.QueryInterface(AM_Ci.nsIFileURL).file;119      setExtensionModifiedTime(ext, updateDate);120      // The pending add-on cannot be disabled or enabled.121      do_check_false(hasFlag(pendingAddons[0].permissions, AddonManager.PERM_CAN_ENABLE));122      do_check_false(hasFlag(pendingAddons[0].permissions, AddonManager.PERM_CAN_DISABLE));123      await promiseRestartManager();124      AddonManager.getAllInstalls(function(activeInstalls) {125        do_check_eq(activeInstalls, 0);126        AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {127          do_check_neq(a1, null);128          do_check_eq(a1.type, "extension");129          do_check_eq(a1.version, "1.0");130          do_check_eq(a1.name, "Test 1");131          do_check_true(isExtensionInAddonsList(profileDir, a1.id));132          do_check_true(do_get_addon("test_install1").exists());133          do_check_in_crash_annotation(a1.id, a1.version);134          do_check_eq(a1.size, ADDON1_SIZE);135          do_check_eq(a1.sourceURI.spec,136                      Services.io.newFileURI(do_get_addon("test_install1")).spec);137          let difference = a1.installDate.getTime() - updateDate;138          if (Math.abs(difference) > MAX_TIME_DIFFERENCE)139            do_throw("Add-on install time was out by " + difference + "ms");140          difference = a1.updateDate.getTime() - updateDate;141          if (Math.abs(difference) > MAX_TIME_DIFFERENCE)142            do_throw("Add-on update time was out by " + difference + "ms");143          do_check_true(a1.hasResource("install.rdf"));144          do_check_false(a1.hasResource("foo.bar"));145          let root_uri = do_get_addon_root_uri(profileDir, "addon1@tests.mozilla.org");146          do_check_eq(a1.getResourceURI("install.rdf").spec, root_uri + "install.rdf");147          do_check_eq(a1.iconURL, root_uri + "icon.png");148          do_check_eq(a1.icon64URL, root_uri + "icon64.png");149          a1.uninstall();150          do_execute_soon(function() { run_test_2(a1) });151        });152      });153    }));154  });155}156// Tests that an install from a url downloads.157function run_test_2(aAddon) {158  let { id, version } = aAddon;159  restartManager();160  do_check_not_in_crash_annotation(id, version);161  let url = "http://localhost:4444/addons/test_install2_1.xpi";162  AddonManager.getInstallForURL(url, function(install) {163    do_check_neq(install, null);164    do_check_eq(install.version, "1.0");165    do_check_eq(install.name, "Test 2");166    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);167    do_check_eq(install.iconURL, null);168    do_check_eq(install.sourceURI.spec, url);169    AddonManager.getAllInstalls(function(activeInstalls) {170      do_check_eq(activeInstalls.length, 1);171      do_check_eq(activeInstalls[0], install);172      prepare_test({}, [173        "onDownloadStarted",174        "onDownloadEnded",175      ], check_test_2);176      install.addListener({177        onDownloadProgress() {178          do_execute_soon(function() {179            Components.utils.forceGC();180          });181        }182      });183      install.install();184    });185  }, "application/x-xpinstall", null, "Test 2", null, "1.0");186}187function check_test_2(install) {188  ensure_test_completed();189  do_check_eq(install.version, "2.0");190  do_check_eq(install.name, "Real Test 2");191  do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);192  do_check_eq(install.addon.install, install);193  do_check_true(hasFlag(install.addon.operationsRequiringRestart,194                        AddonManager.OP_NEEDS_RESTART_INSTALL));195  do_check_eq(install.iconURL, null);196  // Pause the install here and start it again in run_test_3197  do_execute_soon(function() { run_test_3(install); });198  return false;199}200// Tests that the downloaded XPI installs ok201function run_test_3(install) {202  prepare_test({203    "addon2@tests.mozilla.org": [204      "onInstalling"205    ]206  }, [207    "onInstallStarted",208    "onInstallEnded",209  ], check_test_3);210  install.install();211}212function check_test_3(aInstall) {213  // Make the pending install have a sensible date214  let updateDate = Date.now();215  let extURI = aInstall.addon.getResourceURI("");216  let ext = extURI.QueryInterface(AM_Ci.nsIFileURL).file;217  setExtensionModifiedTime(ext, updateDate);218  ensure_test_completed();219  AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(async function(olda2) {220    do_check_eq(olda2, null);221    await promiseRestartManager();222    AddonManager.getAllInstalls(function(installs) {223      do_check_eq(installs, 0);224      AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {225        do_check_neq(a2, null);226        do_check_eq(a2.type, "extension");227        do_check_eq(a2.version, "2.0");228        do_check_eq(a2.name, "Real Test 2");229        do_check_true(isExtensionInAddonsList(profileDir, a2.id));230        do_check_true(do_get_addon("test_install2_1").exists());231        do_check_in_crash_annotation(a2.id, a2.version);232        do_check_eq(a2.sourceURI.spec,233                    "http://localhost:4444/addons/test_install2_1.xpi");234        let difference = a2.installDate.getTime() - updateDate;235        if (Math.abs(difference) > MAX_TIME_DIFFERENCE)236          do_throw("Add-on install time was out by " + difference + "ms");237        difference = a2.updateDate.getTime() - updateDate;238        if (Math.abs(difference) > MAX_TIME_DIFFERENCE)239          do_throw("Add-on update time was out by " + difference + "ms");240        gInstallDate = a2.installDate.getTime();241        run_test_4();242      });243    });244  }));245}246// Tests that installing a new version of an existing add-on works247function run_test_4() {248  prepare_test({ }, [249    "onNewInstall"250  ]);251  let url = "http://localhost:4444/addons/test_install2_2.xpi";252  AddonManager.getInstallForURL(url, function(install) {253    ensure_test_completed();254    do_check_neq(install, null);255    do_check_eq(install.version, "3.0");256    do_check_eq(install.name, "Test 3");257    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);258    AddonManager.getAllInstalls(function(activeInstalls) {259      do_check_eq(activeInstalls.length, 1);260      do_check_eq(activeInstalls[0], install);261      do_check_eq(install.existingAddon, null);262      prepare_test({}, [263        "onDownloadStarted",264        "onDownloadEnded",265      ], check_test_4);266      install.install();267    });268  }, "application/x-xpinstall", null, "Test 3", null, "3.0");269}270function check_test_4(install) {271  ensure_test_completed();272  do_check_eq(install.version, "3.0");273  do_check_eq(install.name, "Real Test 3");274  do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);275  do_check_neq(install.existingAddon);276  do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org");277  do_check_eq(install.addon.install, install);278  do_check_true(hasFlag(install.addon.operationsRequiringRestart,279                        AddonManager.OP_NEEDS_RESTART_INSTALL));280  run_test_5();281  // Installation will continue when there is nothing returned.282}283// Continue installing the new version284function run_test_5() {285  prepare_test({286    "addon2@tests.mozilla.org": [287      "onInstalling"288    ]289  }, [290    "onInstallStarted",291    "onInstallEnded",292  ], check_test_5);293}294function check_test_5(install) {295  ensure_test_completed();296  do_check_eq(install.existingAddon.pendingUpgrade.install, install);297  AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) {298    do_check_neq(olda2, null);299    do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));300    AddonManager.getInstallsByTypes(null, callback_soon(async function(installs) {301      do_check_eq(installs.length, 1);302      do_check_eq(installs[0].addon, olda2.pendingUpgrade);303      await promiseRestartManager();304      AddonManager.getInstallsByTypes(null, function(installs2) {305        do_check_eq(installs2.length, 0);306        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {307          do_check_neq(a2, null);308          do_check_eq(a2.type, "extension");309          do_check_eq(a2.version, "3.0");310          do_check_eq(a2.name, "Real Test 3");311          do_check_true(a2.isActive);312          do_check_true(isExtensionInAddonsList(profileDir, a2.id));313          do_check_true(do_get_addon("test_install2_2").exists());314          do_check_in_crash_annotation(a2.id, a2.version);315          do_check_eq(a2.sourceURI.spec,316                      "http://localhost:4444/addons/test_install2_2.xpi");317          do_check_eq(a2.installDate.getTime(), gInstallDate);318          // Update date should be later (or the same if this test is too fast)319          do_check_true(a2.installDate <= a2.updateDate);320          a2.uninstall();321          do_execute_soon(run_test_6);322        });323      });324    }));325  });326}327// Tests that an install that requires a compatibility update works328function run_test_6() {329  restartManager();330  prepare_test({ }, [331    "onNewInstall"332  ]);333  let url = "http://localhost:4444/addons/test_install3.xpi";334  AddonManager.getInstallForURL(url, function(install) {335    ensure_test_completed();336    do_check_neq(install, null);337    do_check_eq(install.version, "1.0");338    do_check_eq(install.name, "Real Test 4");339    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);340    AddonManager.getInstallsByTypes(null, function(activeInstalls) {341      do_check_eq(activeInstalls.length, 1);342      do_check_eq(activeInstalls[0], install);343      prepare_test({}, [344        "onDownloadStarted",345        "onDownloadEnded",346      ], check_test_6);347      install.install();348    });349  }, "application/x-xpinstall", null, "Real Test 4", null, "1.0");350}351function check_test_6(install) {352  ensure_test_completed();353  do_check_eq(install.version, "1.0");354  do_check_eq(install.name, "Real Test 4");355  do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);356  do_check_eq(install.existingAddon, null);357  do_check_false(install.addon.appDisabled);358  run_test_7();359  return true;360}361// Continue the install362function run_test_7() {363  prepare_test({364    "addon3@tests.mozilla.org": [365      "onInstalling"366    ]367  }, [368    "onInstallStarted",369    "onInstallEnded",370  ], check_test_7);371}372function check_test_7() {373  ensure_test_completed();374  AddonManager.getAddonByID("addon3@tests.mozilla.org", callback_soon(async function(olda3) {375    do_check_eq(olda3, null);376    await promiseRestartManager();377    AddonManager.getAllInstalls(function(installs) {378      do_check_eq(installs, 0);379      AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {380        do_check_neq(a3, null);381        do_check_eq(a3.type, "extension");382        do_check_eq(a3.version, "1.0");383        do_check_eq(a3.name, "Real Test 4");384        do_check_true(a3.isActive);385        do_check_false(a3.appDisabled);386        do_check_true(isExtensionInAddonsList(profileDir, a3.id));387        do_check_true(do_get_addon("test_install3").exists());388        a3.uninstall();389        do_execute_soon(run_test_8);390      });391    });392  }));393}394function run_test_8() {395  restartManager();396  AddonManager.addInstallListener(InstallListener);397  AddonManager.addAddonListener(AddonListener);398  prepare_test({ }, [399    "onNewInstall"400  ]);401  AddonManager.getInstallForFile(do_get_addon("test_install3"), function(install) {402    do_check_true(install.addon.isCompatible);403    prepare_test({404      "addon3@tests.mozilla.org": [405        "onInstalling"406      ]407    }, [408      "onInstallStarted",409      "onInstallEnded",410    ], callback_soon(check_test_8));411    install.install();412  });413}414async function check_test_8() {415  await promiseRestartManager();416  AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {417    do_check_neq(a3, null);418    do_check_eq(a3.type, "extension");419    do_check_eq(a3.version, "1.0");420    do_check_eq(a3.name, "Real Test 4");421    do_check_true(a3.isActive);422    do_check_false(a3.appDisabled);423    do_check_true(isExtensionInAddonsList(profileDir, a3.id));424    do_check_true(do_get_addon("test_install3").exists());425    a3.uninstall();426    do_execute_soon(run_test_9);427  });428}429// Test that after cancelling a download it is removed from the active installs430function run_test_9() {431  restartManager();432  prepare_test({ }, [433    "onNewInstall"434  ]);435  let url = "http://localhost:4444/addons/test_install3.xpi";436  AddonManager.getInstallForURL(url, function(install) {437    ensure_test_completed();438    do_check_neq(install, null);439    do_check_eq(install.version, "1.0");440    do_check_eq(install.name, "Real Test 4");441    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);442    AddonManager.getInstallsByTypes(null, function(activeInstalls) {443      do_check_eq(activeInstalls.length, 1);444      do_check_eq(activeInstalls[0], install);445      prepare_test({}, [446        "onDownloadStarted",447        "onDownloadEnded",448      ], check_test_9);449      install.install();450    });451  }, "application/x-xpinstall", null, "Real Test 4", null, "1.0");452}453function check_test_9(install) {454  prepare_test({}, [455    "onDownloadCancelled"456  ], function() {457    let file = install.file;458    // Allow the file removal to complete459    do_execute_soon(function() {460      AddonManager.getAllInstalls(function(activeInstalls) {461        do_check_eq(activeInstalls.length, 0);462        do_check_false(file.exists());463        run_test_10();464      });465    });466  });467  install.cancel();468}469// Tests that after cancelling a pending install it is removed from the active470// installs471function run_test_10() {472  prepare_test({ }, [473    "onNewInstall"474  ]);475  let url = "http://localhost:4444/addons/test_install3.xpi";476  AddonManager.getInstallForURL(url, function(install) {477    ensure_test_completed();478    do_check_neq(install, null);479    do_check_eq(install.version, "1.0");480    do_check_eq(install.name, "Real Test 4");481    do_check_eq(install.state, AddonManager.STATE_AVAILABLE);482    AddonManager.getInstallsByTypes(null, function(activeInstalls) {483      do_check_eq(activeInstalls.length, 1);484      do_check_eq(activeInstalls[0], install);485      prepare_test({486        "addon3@tests.mozilla.org": [487          "onInstalling"488        ]489      }, [490        "onDownloadStarted",491        "onDownloadEnded",492        "onInstallStarted",493        "onInstallEnded"494      ], check_test_10);495      install.install();496    });497  }, "application/x-xpinstall", null, "Real Test 4", null, "1.0");498}499function check_test_10(install) {500  prepare_test({501    "addon3@tests.mozilla.org": [502      "onOperationCancelled"503    ]504  }, [505    "onInstallCancelled"506  ]);507  install.cancel();508  ensure_test_completed();509  AddonManager.getAllInstalls(callback_soon(function(activeInstalls) {510    do_check_eq(activeInstalls.length, 0);511    restartManager();512    // Check that the install did not complete513    AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {514      do_check_eq(a3, null);515      run_test_11();516    });517  }));518}519function run_test_11() {520  // Tests 11 and 12 were removed, to avoid churn of renumbering,521  // just jump ahead to 13 here522  run_test_13();523}524// Tests that cancelling an upgrade leaves the original add-on's pendingOperations525// correct526function run_test_13() {527  restartManager();528  installAllFiles([do_get_addon("test_install2_1")], function() {529    restartManager();530    prepare_test({ }, [531      "onNewInstall"532    ]);533    let url = "http://localhost:4444/addons/test_install2_2.xpi";534    AddonManager.getInstallForURL(url, function(install) {535      ensure_test_completed();536      do_check_neq(install, null);537      do_check_eq(install.version, "3.0");538      do_check_eq(install.name, "Test 3");539      do_check_eq(install.state, AddonManager.STATE_AVAILABLE);540      AddonManager.getAllInstalls(function(activeInstalls) {541        do_check_eq(activeInstalls.length, 1);542        do_check_eq(activeInstalls[0], install);543        do_check_eq(install.existingAddon, null);544        prepare_test({545          "addon2@tests.mozilla.org": [546            "onInstalling"547          ]548        }, [549          "onDownloadStarted",550          "onDownloadEnded",551          "onInstallStarted",552          "onInstallEnded",553        ], check_test_13);554        install.install();555      });556    }, "application/x-xpinstall", null, "Test 3", null, "3.0");557  });558}559function check_test_13(install) {560  ensure_test_completed();561  do_check_eq(install.version, "3.0");562  do_check_eq(install.name, "Real Test 3");563  do_check_eq(install.state, AddonManager.STATE_INSTALLED);564  do_check_neq(install.existingAddon, null);565  do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org");566  do_check_eq(install.addon.install, install);567  AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) {568    do_check_neq(olda2, null);569    do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));570    do_check_eq(olda2.pendingUpgrade, install.addon);571    do_check_true(hasFlag(install.addon.pendingOperations,572                          AddonManager.PENDING_INSTALL));573    prepare_test({574      "addon2@tests.mozilla.org": [575        "onOperationCancelled"576      ]577    }, [578      "onInstallCancelled",579    ]);580    install.cancel();581    do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));582    do_check_false(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));583    do_check_eq(olda2.pendingUpgrade, null);584    restartManager();585    // Check that the upgrade did not complete586    AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {587      do_check_eq(a2.version, "2.0");588      a2.uninstall();589      do_execute_soon(run_test_14);590    });591  }));592}593// Check that cancelling the install from onDownloadStarted actually cancels it594function run_test_14() {595  restartManager();596  prepare_test({ }, [597    "onNewInstall"598  ]);599  let url = "http://localhost:4444/addons/test_install2_1.xpi";600  AddonManager.getInstallForURL(url, function(install) {601    ensure_test_completed();602    do_check_eq(install.file, null);603    prepare_test({ }, [604      "onDownloadStarted"605    ], check_test_14);606    install.install();607  }, "application/x-xpinstall");608}609function check_test_14(install) {610  prepare_test({ }, [611    "onDownloadCancelled"612  ], function() {613    let file = install.file;614    install.addListener({615      onDownloadProgress() {616        do_throw("Download should not have continued");617      },618      onDownloadEnded() {619        do_throw("Download should not have continued");620      }621    });622    // Allow the listener to return to see if it continues downloading. The623    // The listener only really tests if we give it time to see progress, the624    // file check isn't ideal either625    do_execute_soon(function() {626      do_check_false(file.exists());627      run_test_15();628    });629  });630  // Wait for the channel to be ready to cancel631  do_execute_soon(function() {632    install.cancel();633  });634}635// Checks that cancelling the install from onDownloadEnded actually cancels it636function run_test_15() {637  prepare_test({ }, [638    "onNewInstall"639  ]);640  let url = "http://localhost:4444/addons/test_install2_1.xpi";641  AddonManager.getInstallForURL(url, function(install) {642    ensure_test_completed();643    do_check_eq(install.file, null);644    prepare_test({ }, [645      "onDownloadStarted",646      "onDownloadEnded"647    ], check_test_15);648    install.install();649  }, "application/x-xpinstall");650}651function check_test_15(install) {652  prepare_test({ }, [653    "onDownloadCancelled"654  ]);655  install.cancel();656  ensure_test_completed();657  install.addListener({658    onInstallStarted() {659      do_throw("Install should not have continued");660    }661  });662  // Allow the listener to return to see if it starts installing663  do_execute_soon(run_test_16);664}665// Verify that the userDisabled value carries over to the upgrade by default666function run_test_16() {667  restartManager();668  let url = "http://localhost:4444/addons/test_install2_1.xpi";669  AddonManager.getInstallForURL(url, function(aInstall) {670    aInstall.addListener({671      onInstallStarted() {672        do_check_false(aInstall.addon.userDisabled);673        aInstall.addon.userDisabled = true;674      },675      onInstallEnded() {676       do_execute_soon(function test16_install1() {677        restartManager();678        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {679          do_check_true(a2.userDisabled);680          do_check_false(a2.isActive);681          let url_2 = "http://localhost:4444/addons/test_install2_2.xpi";682          AddonManager.getInstallForURL(url_2, function(aInstall_2) {683            aInstall_2.addListener({684              onInstallEnded() {685               do_execute_soon(function test16_install2() {686                do_check_true(aInstall_2.addon.userDisabled);687                restartManager();688                AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2_2) {689                  do_check_true(a2_2.userDisabled);690                  do_check_false(a2_2.isActive);691                  a2_2.uninstall();692                  do_execute_soon(run_test_17);693                });694               });695              }696            });697            aInstall_2.install();698          }, "application/x-xpinstall");699        });700       });701      }702    });703    aInstall.install();704  }, "application/x-xpinstall");705}706// Verify that changing the userDisabled value before onInstallEnded works707function run_test_17() {708  restartManager();709  let url = "http://localhost:4444/addons/test_install2_1.xpi";710  AddonManager.getInstallForURL(url, function(aInstall) {711    aInstall.addListener({712      onInstallEnded() {713       do_execute_soon(function() {714        do_check_false(aInstall.addon.userDisabled);715        restartManager();716        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {717          do_check_false(a2.userDisabled);718          do_check_true(a2.isActive);719          let url_2 = "http://localhost:4444/addons/test_install2_2.xpi";720          AddonManager.getInstallForURL(url_2, function(aInstall_2) {721            aInstall_2.addListener({722              onInstallStarted() {723                do_check_false(aInstall_2.addon.userDisabled);724                aInstall_2.addon.userDisabled = true;725              },726              onInstallEnded() {727               do_execute_soon(function() {728                restartManager();729                AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2_2) {730                  do_check_true(a2_2.userDisabled);731                  do_check_false(a2_2.isActive);732                  a2_2.uninstall();733                  do_execute_soon(run_test_18);734                });735               });736              }737            });738            aInstall_2.install();739          }, "application/x-xpinstall");740        });741       });742      }743    });744    aInstall.install();745  }, "application/x-xpinstall");746}747// Verify that changing the userDisabled value before onInstallEnded works748function run_test_18() {749  restartManager();750  let url = "http://localhost:4444/addons/test_install2_1.xpi";751  AddonManager.getInstallForURL(url, function(aInstall) {752    aInstall.addListener({753      onInstallStarted() {754        do_check_false(aInstall.addon.userDisabled);755        aInstall.addon.userDisabled = true;756      },757      onInstallEnded() {758       do_execute_soon(function test18_install1() {759        restartManager();760        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {761          do_check_true(a2.userDisabled);762          do_check_false(a2.isActive);763          let url_2 = "http://localhost:4444/addons/test_install2_2.xpi";764          AddonManager.getInstallForURL(url_2, function(aInstall_2) {765            aInstall_2.addListener({766              onInstallStarted() {767                do_check_true(aInstall_2.addon.userDisabled);768                aInstall_2.addon.userDisabled = false;769              },770              onInstallEnded() {771               do_execute_soon(function test18_install2() {772                restartManager();773                AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2_2) {774                  do_check_false(a2_2.userDisabled);775                  do_check_true(a2_2.isActive);776                  a2_2.uninstall();777                  do_execute_soon(run_test_18_1);778                });779               });780              }781            });782            aInstall_2.install();783          }, "application/x-xpinstall");784        });785       });786      }787    });788    aInstall.install();789  }, "application/x-xpinstall");790}791// Checks that metadata is not stored if the pref is set to false792function run_test_18_1() {793  restartManager();794  Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", true);795  Services.prefs.setCharPref(PREF_GETADDONS_BYIDS,796                             "http://localhost:4444/data/test_install.xml");797  Services.prefs.setBoolPref("extensions.addon2@tests.mozilla.org.getAddons.cache.enabled", false);798  let url = "http://localhost:4444/addons/test_install2_1.xpi";799  AddonManager.getInstallForURL(url, function(aInstall) {800    aInstall.addListener({801      onInstallEnded(unused, aAddon) {802       do_execute_soon(function test18_install() {803        do_check_neq(aAddon.fullDescription, "Repository description");804        restartManager();805        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {806          do_check_neq(a2.fullDescription, "Repository description");807          a2.uninstall();808          do_execute_soon(run_test_19);809        });810       });811      }812    });813    aInstall.install();814  }, "application/x-xpinstall");815}816// Checks that metadata is downloaded for new installs and is visible before and817// after restart818function run_test_19() {819  restartManager();820  Services.prefs.setBoolPref("extensions.addon2@tests.mozilla.org.getAddons.cache.enabled", true);821  let url = "http://localhost:4444/addons/test_install2_1.xpi";822  AddonManager.getInstallForURL(url, function(aInstall) {823    aInstall.addListener({824      onInstallEnded(unused, aAddon) {825       do_execute_soon(function test19_install() {826        do_check_eq(aAddon.fullDescription, "Repository description");827        restartManager();828        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {829          do_check_eq(a2.fullDescription, "Repository description");830          a2.uninstall();831          do_execute_soon(run_test_20);832        });833       });834      }835    });836    aInstall.install();837  }, "application/x-xpinstall");838}839// Do the same again to make sure it works when the data is already in the cache840function run_test_20() {841  restartManager();842  let url = "http://localhost:4444/addons/test_install2_1.xpi";843  AddonManager.getInstallForURL(url, function(aInstall) {844    aInstall.addListener({845      onInstallEnded(unused, aAddon) {846       do_execute_soon(function test20_install() {847        do_check_eq(aAddon.fullDescription, "Repository description");848        restartManager();849        AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {850          do_check_eq(a2.fullDescription, "Repository description");851          a2.uninstall();852          do_execute_soon(run_test_21);853        });854       });855      }856    });857    aInstall.install();858  }, "application/x-xpinstall");859}860// Verify that installing an add-on that is already pending install cancels the861// first install862function run_test_21() {863  restartManager();864  Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", false);865  installAllFiles([do_get_addon("test_install2_1")], function() {866    AddonManager.getAllInstalls(function(aInstalls) {867      do_check_eq(aInstalls.length, 1);868      prepare_test({869        "addon2@tests.mozilla.org": [870          "onOperationCancelled",871          "onInstalling"872        ]873      }, [874        "onNewInstall",875        "onDownloadStarted",876        "onDownloadEnded",877        "onInstallStarted",878        "onInstallCancelled",879        "onInstallEnded",880      ], check_test_21);881      let url = "http://localhost:4444/addons/test_install2_1.xpi";882      AddonManager.getInstallForURL(url, function(aInstall) {883        aInstall.install();884      }, "application/x-xpinstall");885    });886  });887}888function check_test_21(aInstall) {889  AddonManager.getAllInstalls(callback_soon(function(aInstalls) {890    do_check_eq(aInstalls.length, 1);891    do_check_eq(aInstalls[0], aInstall);892    prepare_test({893      "addon2@tests.mozilla.org": [894        "onOperationCancelled"895      ]896    }, [897      "onInstallCancelled",898    ]);899    aInstall.cancel();900    ensure_test_completed();901    restartManager();902    AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {903      do_check_eq(a2, null);904      run_test_22();905    });906  }));907}908// Tests that an install can be restarted after being cancelled909function run_test_22() {910  prepare_test({ }, [911    "onNewInstall"912  ]);913  let url = "http://localhost:4444/addons/test_install3.xpi";914  AddonManager.getInstallForURL(url, function(aInstall) {915    ensure_test_completed();916    do_check_neq(aInstall, null);917    do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);918    prepare_test({}, [919      "onDownloadStarted",920      "onDownloadEnded",921    ], check_test_22);922    aInstall.install();923  }, "application/x-xpinstall");924}925function check_test_22(aInstall) {926  prepare_test({}, [927    "onDownloadCancelled"928  ]);929  aInstall.cancel();930  ensure_test_completed();931  prepare_test({932    "addon3@tests.mozilla.org": [933      "onInstalling"934    ]935  }, [936    "onDownloadStarted",937    "onDownloadEnded",938    "onInstallStarted",939    "onInstallEnded"940  ], finish_test_22);941  aInstall.install();942}943function finish_test_22(aInstall) {944  prepare_test({945    "addon3@tests.mozilla.org": [946      "onOperationCancelled"947    ]948  }, [949    "onInstallCancelled"950  ]);951  aInstall.cancel();952  ensure_test_completed();953  run_test_23();954}955// Tests that an install can be restarted after being cancelled when a hash956// was provided957function run_test_23() {958  prepare_test({ }, [959    "onNewInstall"960  ]);961  let url = "http://localhost:4444/addons/test_install3.xpi";962  AddonManager.getInstallForURL(url, function(aInstall) {963    ensure_test_completed();964    do_check_neq(aInstall, null);965    do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);966    prepare_test({}, [967      "onDownloadStarted",968      "onDownloadEnded",969    ], check_test_23);970    aInstall.install();971  }, "application/x-xpinstall", do_get_addon_hash("test_install3"));972}973function check_test_23(aInstall) {974  prepare_test({}, [975    "onDownloadCancelled"976  ]);977  aInstall.cancel();978  ensure_test_completed();979  prepare_test({980    "addon3@tests.mozilla.org": [981      "onInstalling"982    ]983  }, [984    "onDownloadStarted",985    "onDownloadEnded",986    "onInstallStarted",987    "onInstallEnded"988  ], finish_test_23);989  aInstall.install();990}991function finish_test_23(aInstall) {992  prepare_test({993    "addon3@tests.mozilla.org": [994      "onOperationCancelled"995    ]996  }, [997    "onInstallCancelled"998  ]);999  aInstall.cancel();1000  ensure_test_completed();1001  run_test_24();1002}1003// Tests that an install with a bad hash can be restarted after it fails, though1004// it will only fail again1005function run_test_24() {1006  prepare_test({ }, [1007    "onNewInstall"1008  ]);1009  let url = "http://localhost:4444/addons/test_install3.xpi";1010  AddonManager.getInstallForURL(url, function(aInstall) {1011    ensure_test_completed();1012    do_check_neq(aInstall, null);1013    do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);1014    prepare_test({}, [1015      "onDownloadStarted",1016      "onDownloadFailed",1017    ], check_test_24);1018    aInstall.install();1019  }, "application/x-xpinstall", "sha1:foo");1020}1021function check_test_24(aInstall) {1022  prepare_test({ }, [1023    "onDownloadStarted",1024    "onDownloadFailed"1025  ], run_test_25);1026  aInstall.install();1027}1028// Tests that installs with a hash for a local file work1029function run_test_25() {1030  prepare_test({ }, [1031    "onNewInstall"1032  ]);1033  let url = Services.io.newFileURI(do_get_addon("test_install3")).spec;1034  AddonManager.getInstallForURL(url, function(aInstall) {1035    ensure_test_completed();1036    do_check_neq(aInstall, null);1037    do_check_eq(aInstall.state, AddonManager.STATE_DOWNLOADED);1038    do_check_eq(aInstall.error, 0);1039    prepare_test({ }, [1040      "onDownloadCancelled"1041    ]);1042    aInstall.cancel();1043    ensure_test_completed();1044    run_test_26();1045  }, "application/x-xpinstall", do_get_addon_hash("test_install3"));1046}1047function run_test_26() {1048  prepare_test({ }, [1049    "onNewInstall",1050    "onDownloadStarted",1051    "onDownloadCancelled"1052  ]);1053  let observerService = AM_Cc["@mozilla.org/network/http-activity-distributor;1"].1054                        getService(AM_Ci.nsIHttpActivityDistributor);1055  observerService.addObserver({1056    observeActivity(aChannel, aType, aSubtype, aTimestamp, aSizeData,1057                              aStringData) {1058      aChannel.QueryInterface(AM_Ci.nsIChannel);1059      // Wait for the final event for the redirected URL1060      if (aChannel.URI.spec != "http://localhost:4444/addons/test_install1.xpi" ||1061          aType != AM_Ci.nsIHttpActivityObserver.ACTIVITY_TYPE_HTTP_TRANSACTION ||1062          aSubtype != AM_Ci.nsIHttpActivityObserver.ACTIVITY_SUBTYPE_TRANSACTION_CLOSE)1063        return;1064      // Request should have been cancelled1065      do_check_eq(aChannel.status, Components.results.NS_BINDING_ABORTED);1066      observerService.removeObserver(this);1067      run_test_27();1068    }1069  });1070  let url = "http://localhost:4444/redirect?/addons/test_install1.xpi";1071  AddonManager.getInstallForURL(url, function(aInstall) {1072    aInstall.addListener({1073      onDownloadProgress(aDownloadProgressInstall) {1074        aDownloadProgressInstall.cancel();1075      }1076    });1077    aInstall.install();1078  }, "application/x-xpinstall");1079}1080// Tests that an install can be restarted during onDownloadCancelled after being1081// cancelled in mid-download1082function run_test_27() {1083  prepare_test({ }, [1084    "onNewInstall"1085  ]);1086  let url = "http://localhost:4444/addons/test_install3.xpi";1087  AddonManager.getInstallForURL(url, function(aInstall) {1088    ensure_test_completed();1089    do_check_neq(aInstall, null);1090    do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);1091    aInstall.addListener({1092      onDownloadProgress() {1093        aInstall.removeListener(this);1094        aInstall.cancel();1095      }1096    });1097    prepare_test({}, [1098      "onDownloadStarted",1099      "onDownloadCancelled",1100    ], check_test_27);1101    aInstall.install();1102  }, "application/x-xpinstall");1103}1104function check_test_27(aInstall) {1105  prepare_test({1106    "addon3@tests.mozilla.org": [1107      "onInstalling"1108    ]1109  }, [1110    "onDownloadStarted",1111    "onDownloadEnded",1112    "onInstallStarted",1113    "onInstallEnded"1114  ], finish_test_27);1115  let file = aInstall.file;1116  aInstall.install();1117  do_check_neq(file.path, aInstall.file.path);1118  do_check_false(file.exists());1119}1120function finish_test_27(aInstall) {1121  prepare_test({1122    "addon3@tests.mozilla.org": [1123      "onOperationCancelled"1124    ]1125  }, [1126    "onInstallCancelled"1127  ]);1128  aInstall.cancel();1129  ensure_test_completed();1130  run_test_30();...

Full Screen

Full Screen

offlineinstalldialog.js

Source:offlineinstalldialog.js Github

copy

Full Screen

1// Copyright 2007 The Closure Library Authors. All Rights Reserved.2//3// Licensed under the Apache License, Version 2.0 (the "License");4// you may not use this file except in compliance with the License.5// You may obtain a copy of the License at6//7//      http://www.apache.org/licenses/LICENSE-2.08//9// Unless required by applicable law or agreed to in writing, software10// distributed under the License is distributed on an "AS-IS" BASIS,11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12// See the License for the specific language governing permissions and13// limitations under the License.14/**15 * @fileoverview A dialog for presenting the offline (Gears) install flow. It16 * show information on how to install Gears if Gears is not already installed,17 * or will offer the option to enable the application for Gears support.18 *19 * @see ../demos/offline.html20 */21goog.provide('goog.ui.OfflineInstallDialog');22goog.provide('goog.ui.OfflineInstallDialog.ButtonKeyType');23goog.provide('goog.ui.OfflineInstallDialog.EnableScreen');24goog.provide('goog.ui.OfflineInstallDialog.InstallScreen');25goog.provide('goog.ui.OfflineInstallDialog.InstallingGearsScreen');26goog.provide('goog.ui.OfflineInstallDialog.ScreenType');27goog.provide('goog.ui.OfflineInstallDialog.UpgradeScreen');28goog.provide('goog.ui.OfflineInstallDialogScreen');29goog.require('goog.Disposable');30goog.require('goog.dom.classes');31goog.require('goog.gears');32goog.require('goog.string');33goog.require('goog.string.StringBuffer');34goog.require('goog.ui.Dialog');35goog.require('goog.ui.Dialog.ButtonSet');36goog.require('goog.ui.Dialog.EventType');37goog.require('goog.window');38/**39 * An offline install dialog.40 * @param {string=} opt_class CSS class name for the dialog element, also used41 *    as a class name prefix for related elements; defaults to modal-dialog.42 * @param {boolean=} opt_useIframeMask Work around windowed controls z-index43 *     issue by using an iframe instead of a div for bg element.44 * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.45 * @constructor46 * @extends {goog.ui.Dialog}47 */48goog.ui.OfflineInstallDialog = function(49    opt_class, opt_useIframeMask, opt_domHelper) {50  goog.ui.Dialog.call(this, opt_class, opt_useIframeMask, opt_domHelper);51  /**52   * This is used to allow more screens to be added programatically. It is a53   * map from screen type to a constructor that extends54   * goog.ui.OfflineInstallDialogScreen.55   * @type {Object}56   * @private57   */58  this.screenConstructors_ = {};59  /**60   * This is a map of constructed screens. It uses the constructors in the61   * screenConstructors_ map.62   * @type {Object}63   * @private64   */65  this.screens_ = {};66  this.currentScreenType_ = goog.gears.hasFactory() ?67      goog.ui.OfflineInstallDialog.ScreenType.ENABLE :68      goog.ui.OfflineInstallDialog.ScreenType.INSTALL;69  this.registerScreenType(goog.ui.OfflineInstallDialog.EnableScreen.TYPE,70                          goog.ui.OfflineInstallDialog.EnableScreen);71  this.registerScreenType(goog.ui.OfflineInstallDialog.InstallScreen.TYPE,72                          goog.ui.OfflineInstallDialog.InstallScreen);73  this.registerScreenType(goog.ui.OfflineInstallDialog.UpgradeScreen.TYPE,74                          goog.ui.OfflineInstallDialog.UpgradeScreen);75  this.registerScreenType(76      goog.ui.OfflineInstallDialog.InstallingGearsScreen.TYPE,77      goog.ui.OfflineInstallDialog.InstallingGearsScreen);78};79goog.inherits(goog.ui.OfflineInstallDialog, goog.ui.Dialog);80/**81 * Buttons keys of the dialog.82 * @enum {string}83 */84goog.ui.OfflineInstallDialog.ButtonKeyType = {85  INSTALL: 'io',86  UPGRADE: 'u',87  ENABLE: 'eo',88  CANCEL: 'ca',89  CLOSE: 'cl',90  OK: 'ok'91};92/**93 * The various types of screens the dialog can display.94 * @enum {string}95 */96goog.ui.OfflineInstallDialog.ScreenType = {97  INSTALL: 'i',98  INSTALLING_GEARS: 'ig',99  ENABLE: 'e',100  UPGRADE: 'u'101};102/**103 * Whether the dialog is dirty and requires an upate to its display.104 * @type {boolean}105 * @private106 */107goog.ui.OfflineInstallDialog.prototype.dirty_ = false;108/**109 * The type of the current screen of the dialog.110 * @type {string}111 * @private112 */113goog.ui.OfflineInstallDialog.prototype.currentScreenType_;114/**115 * The url of the application.116 * @type {string}117 * @private118 */119goog.ui.OfflineInstallDialog.prototype.appUrl_ = '';120/**121 * The url of the page to download Gears from.122 * @type {string}123 * @private124 */125goog.ui.OfflineInstallDialog.prototype.gearsDownloadPageUrl_ = '';126/**127 * Marks as dirty and calls update if needed.128 * @private129 */130goog.ui.OfflineInstallDialog.prototype.invalidateAndUpdate_ = function() {131  this.dirty_ = true;132  if (this.getElement() && this.isVisible()) {133    this.update();134  }135};136/**137 * Sets the URL of the appliction to show in the dialog.138 * @param {string} url The application URL.139 */140goog.ui.OfflineInstallDialog.prototype.setAppUrl = function(url) {141  this.appUrl_ = url;142  this.invalidateAndUpdate_();143};144/**145 * @return {string} The application URL.146 */147goog.ui.OfflineInstallDialog.prototype.getAppUrl = function() {148  return this.appUrl_;149};150/**151 * Sets the Gears download page URL.152 * @param {string} url The Gears download page URL.153 */154goog.ui.OfflineInstallDialog.prototype.setGearsDownloadPageUrl = function(url) {155  this.gearsDownloadPageUrl_ = url;156  this.invalidateAndUpdate_();157};158/**159 * @return {string} The Gears download page URL.160 */161goog.ui.OfflineInstallDialog.prototype.getGearsDownloadPageUrl = function() {162  return this.gearsDownloadPageUrl_;163};164/**165 * This allows you to provide a shorter and more user friendly URL to the Gears166 * download page since the Gears download URL can get quite ugly with all its167 * params.168 * @return {string} The Gears download page friendly URL.169 */170goog.ui.OfflineInstallDialog.prototype.getGearsDownloadPageFriendlyUrl =171    function() {172  return this.gearsDownloadPageFriendlyUrl_ || this.gearsDownloadPageUrl_;173};174/**175 * Sets the Gears download page friendly URL.176 * @see #getGearsDownloadPageFriendlyUrl177 * @param {string} url The Gears download page friendly URL.178 */179goog.ui.OfflineInstallDialog.prototype.setGearsDownloadPageFriendlyUrl =180    function(url) {181  this.gearsDownloadPageFriendlyUrl_ = url;182  this.invalidateAndUpdate_();183};184/**185 * Sets the screen type.186 * @param {string} screenType The screen type.187 */188goog.ui.OfflineInstallDialog.prototype.setCurrentScreenType = function(189    screenType) {190  if (screenType != this.currentScreenType_) {191    // If we have a current screen object then call deactivate on it192    var currentScreen = this.getCurrentScreen();193    if (currentScreen && this.isInDocument()) {194      currentScreen.deactivate();195    }196    this.currentScreenType_ = screenType;197    this.invalidateAndUpdate_();198  }199};200/**201 * @return {string} The screen type.202 */203goog.ui.OfflineInstallDialog.prototype.getCurrentScreenType = function() {204  return this.currentScreenType_;205};206/**207 * @return {goog.ui.OfflineInstallDialogScreen?} The current screen object.208 */209goog.ui.OfflineInstallDialog.prototype.getCurrentScreen = function() {210  return this.getScreen(this.currentScreenType_);211};212/**213 * Returns the screen object for a given registered type or null if no such type214 * exists. This will create a screen object for a registered type as needed.215 * @param {string} type  The type of screen to get.216 * @return {goog.ui.OfflineInstallDialogScreen?} The screen object.217 */218goog.ui.OfflineInstallDialog.prototype.getScreen = function(type) {219  if (this.screens_[type]) {220    return this.screens_[type];221  }222  // Construct lazily as needed223  if (this.screenConstructors_[type]) {224    return this.screens_[type] = new this.screenConstructors_[type](this);225  }226  return null;227};228/**229 * Registers a screen constructor to be usable with the dialog.230 * @param {string} type  The type of this screen.231 * @param {Function} constr  A function that represents a constructor that232 *     extends goog.ui.OfflineInstallDialogScreen.233 */234goog.ui.OfflineInstallDialog.prototype.registerScreenType = function(type,235                                                                     constr) {236  this.screenConstructors_[type] = constr;237  // Remove screen in case it already exists.238  if (this.screens_[type]) {239    var isCurrenScreenType = this.currentScreenType_ == type;240    this.screens_[type].dispose();241    delete this.screens_[type];242    if (isCurrenScreenType) {243      this.invalidateAndUpdate_();244    }245  }246};247/**248 * Registers an instance of a screen to be usable with the dialog.249 * @param {goog.ui.OfflineInstallDialogScreen} screen The screen to register.250 */251goog.ui.OfflineInstallDialog.prototype.registerScreen = function(screen) {252  this.screens_[screen.getType()] = screen;253};254/** @override */255goog.ui.OfflineInstallDialog.prototype.setVisible = function(visible) {256  if (this.isInDocument() && visible) {257    if (this.dirty_) {258      this.update();259    }260  }261  goog.ui.OfflineInstallDialog.superClass_.setVisible.call(this, visible);262};263/** @override */264goog.ui.OfflineInstallDialog.prototype.createDom = function() {265  goog.ui.OfflineInstallDialog.superClass_.createDom.call(this);266  this.update();267};268/** @override */269goog.ui.OfflineInstallDialog.prototype.enterDocument = function() {270  goog.ui.OfflineInstallDialog.superClass_.enterDocument.call(this);271  this.getHandler().listen(272      this, goog.ui.Dialog.EventType.SELECT, this.handleSelect_);273  if (this.dirty_) {274    this.update();275  }276};277/**278 * Updates the dialog. This will ensure the correct screen is shown.279 */280goog.ui.OfflineInstallDialog.prototype.update = function() {281  if (this.getElement()) {282    var screen = this.getCurrentScreen();283    if (screen) {284      screen.activate();285    }286    // Clear the dirty state.287    this.dirty_ = false;288  }289};290/**291 * Handles the SELECT_EVENT for the current dialog. Forward the event to the292 * correct screen object and let the screen decide where to go next.293 * @param {goog.ui.Dialog.Event} e The event.294 * @private295 */296goog.ui.OfflineInstallDialog.prototype.handleSelect_ = function(e) {297  var screen = this.getCurrentScreen();298  if (screen) {299    screen.handleSelect(e);300  }301};302/**303 * Opens a new browser window with the Gears download page and changes304 * the screen to the installing gears page.305 */306goog.ui.OfflineInstallDialog.prototype.goToGearsDownloadPage = function() {307  goog.window.open(this.gearsDownloadPageUrl_);308};309/** @override */310goog.ui.OfflineInstallDialog.prototype.disposeInternal = function() {311  goog.ui.OfflineInstallDialog.superClass_.disposeInternal.call(this);312  delete this.screenConstructors_;313  for (var type in this.screens_) {314    this.screens_[type].dispose();315  }316  delete this.screens_;317};318/**319 * Represents a screen on the dialog. You can create new screens and add them320 * to the offline install dialog by calling registerScreenType and321 * setCurrentScreenType.322 * @param {goog.ui.OfflineInstallDialog} dialog  The dialog this screen should323 *     work with.324 * @param {string} type  The screen type name.325 * @constructor326 * @extends {goog.Disposable}327 */328goog.ui.OfflineInstallDialogScreen = function(dialog, type) {329  goog.Disposable.call(this);330  /**331   * @type {goog.ui.OfflineInstallDialog}332   * @protected333   * @suppress {underscore}334   */335  this.dialog_ = dialog;336  /**337   * @type {string}338   * @private339   */340  this.type_ = type;341  /**342   * @type {goog.dom.DomHelper}343   * @private344   */345  this.dom_ = dialog.getDomHelper();346};347goog.inherits(goog.ui.OfflineInstallDialogScreen, goog.Disposable);348/**349 * The HTML content to show on the screen.350 * @type {string}351 * @private352 */353goog.ui.OfflineInstallDialogScreen.prototype.content_ = '';354/**355 * The title to show on the dialog.356 * @type {string}357 * @private358 */359goog.ui.OfflineInstallDialogScreen.prototype.title_ = '';360/**361 * The button set to use with this screen.362 * @type {goog.ui.Dialog.ButtonSet}363 * @private364 */365goog.ui.OfflineInstallDialogScreen.prototype.buttonSet_;366/**367 * @return {goog.ui.OfflineInstallDialog} The dialog the screen will be368 *     displayed in.369 */370goog.ui.OfflineInstallDialogScreen.prototype.getDialog = function() {371  return this.dialog_;372};373/**374 * Returns the type of the screen. This is used to identify the screen type this375 * reflects.376 * @return {string} The type of the screen.377 */378goog.ui.OfflineInstallDialogScreen.prototype.getType = function() {379  return this.type_;380};381/**382 * @return {goog.ui.Dialog.ButtonSet} The button set to use with this screen.383 */384goog.ui.OfflineInstallDialogScreen.prototype.getButtonSet = function() {385  return this.buttonSet_;386};387/**388 * Sets the button set to use with this screen.389 * @param {goog.ui.Dialog.ButtonSet} bs The button set to use.390 */391goog.ui.OfflineInstallDialogScreen.prototype.setButtonSet = function(bs) {392  this.buttonSet_ = bs;393};394/**395 * @return {string} The HTML content to used for this screen.396 */397goog.ui.OfflineInstallDialogScreen.prototype.getContent = function() {398  return this.content_;399};400/**401 * Sets the HTML content to use for this screen.402 * @param {string} html  The HTML text to use as content for the screen.403 */404goog.ui.OfflineInstallDialogScreen.prototype.setContent = function(html) {405  this.content_ = html;406};407/**408 * @return {string} The text title to used for the dialog when this screen is409 *     shown.410 */411goog.ui.OfflineInstallDialogScreen.prototype.getTitle = function() {412  return this.title_ || this.dialog_.getTitle();413};414/**415 * Sets the plain text title to use for this screen.416 * @param {string} title  The plain text to use as a title on the dialog.417 */418goog.ui.OfflineInstallDialogScreen.prototype.setTitle = function(title) {419  this.title_ = title;420};421/**422 * @return {string} A custom class name that should be added to the dialog when423 *     this screen is active.424 */425goog.ui.OfflineInstallDialogScreen.prototype.getCustomClassName = function() {426  return this.customClassName_;427};428/**429 * Sets the custom class name that should be added to the dialog when this430 * screen is active.431 * @param {string} customClassName  The custom class name.432 */433goog.ui.OfflineInstallDialogScreen.prototype.setCustomClassName = function(434    customClassName) {435  this.customClassName_ = customClassName;436};437/**438 * Called when the screen is shown. At this point the dialog is in the document.439 */440goog.ui.OfflineInstallDialogScreen.prototype.activate = function() {441  var d = this.dialog_;442  // Add custom class.443  var customClassName = this.getCustomClassName();444  if (customClassName) {445    goog.dom.classes.add(d.getElement(), customClassName);446  }447  d.setTitle(this.getTitle());448  d.setContent(this.getContent());449  d.setButtonSet(this.getButtonSet());450};451/**452 * Called when the screen is hidden.  At this point the dialog is in the453 * document.454 */455goog.ui.OfflineInstallDialogScreen.prototype.deactivate = function() {456  // Remove custom class name457  var customClassName = this.getCustomClassName();458  if (customClassName) {459    goog.dom.classes.remove(this.dialog_.getElement(), customClassName);460  }461};462/**463 * Called when the user clicks any of the buttons for this dialog screen.464 * @param {goog.ui.Dialog.Event} e The dialog event.465 */466goog.ui.OfflineInstallDialogScreen.prototype.handleSelect = function(e) {467};468// Classes for some of the standard screens469/**470 * This screen is shown to users that do have Gears installed but have471 * not enabled the current application for offline access.472 * @param {goog.ui.OfflineInstallDialog} dialog  The dialog this is a screen473 *     for.474 * @constructor475 * @extends {goog.ui.OfflineInstallDialogScreen}476 */477goog.ui.OfflineInstallDialog.EnableScreen = function(dialog) {478  goog.ui.OfflineInstallDialogScreen.call(this, dialog,479      goog.ui.OfflineInstallDialog.EnableScreen.TYPE);480  /**481   * @desc Text of button that enables offline functionality for the app.482   * @hidden483   */484  var MSG_OFFLINE_DIALOG_ENABLE_GEARS = goog.getMsg('Enable offline access');485  /**486   * @type {string}487   * @protected488   * @suppress {underscore}489   */490  this.enableMsg_ = MSG_OFFLINE_DIALOG_ENABLE_GEARS;491};492goog.inherits(goog.ui.OfflineInstallDialog.EnableScreen,493              goog.ui.OfflineInstallDialogScreen);494/**495 * The type of this screen.496 * @type {string}497 */498goog.ui.OfflineInstallDialog.EnableScreen.TYPE =499    goog.ui.OfflineInstallDialog.ScreenType.ENABLE;500/**501 * Should enable button action be performed immediately when the user presses502 * the enter key anywhere on the dialog. This should be set to false if there503 * are other action handlers on the dialog that may stop propagation.504 * @type {boolean}505 * @protected506 */507goog.ui.OfflineInstallDialog.EnableScreen.prototype.enableOnEnter = true;508/**509 * @return {goog.ui.Dialog.ButtonSet} The button set for the enable screen.510 * @override511 */512goog.ui.OfflineInstallDialog.EnableScreen.prototype.getButtonSet = function() {513  if (!this.buttonSet_) {514    /**515     * @desc Text of button that cancels setting up Offline.516     * @hidden517     */518    var MSG_OFFLINE_DIALOG_CANCEL = goog.getMsg('Cancel');519    var buttonSet = this.buttonSet_ = new goog.ui.Dialog.ButtonSet(this.dom_);520    buttonSet.set(goog.ui.OfflineInstallDialog.ButtonKeyType.ENABLE,521        this.enableMsg_, this.enableOnEnter, false);522    buttonSet.set(goog.ui.OfflineInstallDialog.ButtonKeyType.CANCEL,523        MSG_OFFLINE_DIALOG_CANCEL, false, true);524  }525  return this.buttonSet_;526};527/**528 * This screen is shown to users that do have Gears installed but have529 * not enabled the current application for offline access.530 * @param {goog.ui.OfflineInstallDialog} dialog  The dialog this is a screen531 *     for.532 * @param {string=} opt_type An optional type, for specifying a more specific533 *     type of dialog. Only for use by subclasses.534 * @constructor535 * @extends {goog.ui.OfflineInstallDialogScreen}536 */537goog.ui.OfflineInstallDialog.InstallScreen = function(dialog, opt_type) {538  goog.ui.OfflineInstallDialogScreen.call(this, dialog,539      opt_type || goog.ui.OfflineInstallDialog.InstallScreen.TYPE);540  /**541   * @desc The description of the the install step to perform in order to542   *     enable offline access.543   * @hidden544   */545  var MSG_OFFLINE_DIALOG_INSTALL_GEARS = goog.getMsg('Install Gears');546  /**547   * @type {string}548   * @protected549   * @suppress {underscore}550   */551  this.installMsg_ = MSG_OFFLINE_DIALOG_INSTALL_GEARS;552  /**553   * @desc Text of button that opens the download page for Gears.554   * @hidden555   */556  var MSG_INSTALL_GEARS = goog.getMsg('Get Gears now');557  /**558   * @type {string}559   * @protected560   * @suppress {underscore}561   */562  this.enableMsg_ = MSG_INSTALL_GEARS;563  /**564   * @desc Text of button that cancels setting up Offline.565   * @hidden566   */567  var MSG_OFFLINE_DIALOG_CANCEL_2 = goog.getMsg('Cancel');568  /**569   * @type {string}570   * @private571   */572  this.cancelMsg_ = MSG_OFFLINE_DIALOG_CANCEL_2;573};574goog.inherits(goog.ui.OfflineInstallDialog.InstallScreen,575              goog.ui.OfflineInstallDialogScreen);576/**577 * The type of this screen.578 * @type {string}579 */580goog.ui.OfflineInstallDialog.InstallScreen.TYPE =581    goog.ui.OfflineInstallDialog.ScreenType.INSTALL;582/**583 * The text to show before the installation steps.584 * @type {string}585 * @private586 */587goog.ui.OfflineInstallDialog.InstallScreen.prototype.installDescription_ = '';588/**589 * The CSS className to use when showing the app url.590 * @type {string}591 * @private592 */593goog.ui.OfflineInstallDialog.InstallScreen.prototype.appUrlClassName_ =594    goog.getCssName('goog-offlinedialog-url');595/**596 * The CSS className for the element that contains the install steps.597 * @type {string}598 * @private599 */600goog.ui.OfflineInstallDialog.InstallScreen.prototype.stepsClassName_ =601    goog.getCssName('goog-offlinedialog-steps');602/**603 * The CSS className for each step element.604 * @type {string}605 * @private606 */607goog.ui.OfflineInstallDialog.InstallScreen.prototype.stepClassName_ =608    goog.getCssName('goog-offlinedialog-step');609/**610 * The CSS className for the element that shows the step number.611 * @type {string}612 * @private613 */614goog.ui.OfflineInstallDialog.InstallScreen.prototype.stepNumberClassName_ =615    goog.getCssName('goog-offlinedialog-step-number');616/**617 * The CSS className for the element that shows the step desccription.618 * @type {string}619 * @private620 */621goog.ui.OfflineInstallDialog.InstallScreen.prototype.stepDescriptionClassName_ =622    goog.getCssName('goog-offlinedialog-step-description');623/**624 * Should install button action be performed immediately when the user presses625 * the enter key anywhere on the dialog. This should be set to false if there626 * are other action handlers on the dialog that may stop propagation.627 * @type {boolean}628 * @protected629 */630goog.ui.OfflineInstallDialog.InstallScreen.prototype.isInstallButtonDefault =631    true;632/**633 * @return {goog.ui.Dialog.ButtonSet} The button set for the install screen.634 * @override635 */636goog.ui.OfflineInstallDialog.InstallScreen.prototype.getButtonSet = function() {637  if (!this.buttonSet_) {638    var buttonSet = this.buttonSet_ = new goog.ui.Dialog.ButtonSet(this.dom_);639    buttonSet.set(goog.ui.OfflineInstallDialog.ButtonKeyType.INSTALL,640        this.enableMsg_, this.isInstallButtonDefault, false);641    buttonSet.set(goog.ui.OfflineInstallDialog.ButtonKeyType.CANCEL,642        this.cancelMsg_, false, true);643  }644  return this.buttonSet_;645};646/**647 * Sets the install description. This is the text before the installation steps.648 * @param {string} description  The install description.649 */650goog.ui.OfflineInstallDialog.InstallScreen.prototype.setInstallDescription =651    function(description) {652  this.installDescription_ = description;653};654/** @override */655goog.ui.OfflineInstallDialog.InstallScreen.prototype.getContent = function() {656  if (!this.content_) {657    var sb = new goog.string.StringBuffer(this.installDescription_);658    /**659     * @desc Header for the section that states the steps for the user to660     *     perform in order to enable offline access.661     * @hidden662     */663    var MSG_OFFLINE_DIALOG_NEED_TO = goog.getMsg('You\'ll need to:');664    sb.append('<div class="', this.stepsClassName_, '">',665        MSG_OFFLINE_DIALOG_NEED_TO);666    // Create and append the html for step #1.667    sb.append(this.getStepHtml_(1, this.installMsg_));668    // Create and append the html for step #2.669    /**670     * @desc One of the steps to perform in order to enable offline access.671     * @hidden672     */673    var MSG_OFFLINE_DIALOG_RESTART_BROWSER = goog.getMsg(674        'Restart your browser');675    sb.append(this.getStepHtml_(2, MSG_OFFLINE_DIALOG_RESTART_BROWSER));676    // Create and append the html for step #3.677    /**678     * @desc One of the steps to perform in order to enable offline access.679     * @hidden680     */681    var MSG_OFFLINE_DIALOG_COME_BACK = goog.getMsg('Come back to {$appUrl}!', {682      'appUrl': '<span class="' + this.appUrlClassName_ + '">' +683          this.dialog_.getAppUrl() + '</span>'684    });685    sb.append(this.getStepHtml_(3, MSG_OFFLINE_DIALOG_COME_BACK));686    // Close the enclosing element.687    sb.append('</div>');688    this.content_ = String(sb);689  }690  return this.content_;691};692/**693 * Creats the html for a step.694 * @param {number} stepNumber The number of the step.695 * @param {string} description The description of the step.696 * @private697 * @return {string} The step HTML in string form.698 */699goog.ui.OfflineInstallDialog.InstallScreen.prototype.getStepHtml_ = function(700    stepNumber, description) {701  return goog.string.buildString('<div class="', this.stepClassName_,702      '"><span class="', this.stepNumberClassName_, '">', stepNumber,703      '</span><span class="', this.stepDescriptionClassName_, '">',704      description, '</span></div>');705};706/**707 * Overrides to go to Gears page.708 * @override709 */710goog.ui.OfflineInstallDialog.InstallScreen.prototype.handleSelect =711    function(e) {712  switch (e.key) {713    case goog.ui.OfflineInstallDialog.ButtonKeyType.INSTALL:714    case goog.ui.OfflineInstallDialog.ButtonKeyType.UPGRADE:715      e.preventDefault();716      this.dialog_.goToGearsDownloadPage();717      this.dialog_.setCurrentScreenType(718          goog.ui.OfflineInstallDialog.ScreenType.INSTALLING_GEARS);719      break;720  }721};722/**723 * This screen is shown to users that needs to update their version of Gears724 * before they can enabled the current application for offline access.725 * @param {goog.ui.OfflineInstallDialog} dialog  The dialog this is a screen726 *     for.727 * @constructor728 * @extends {goog.ui.OfflineInstallDialog.InstallScreen}729 */730goog.ui.OfflineInstallDialog.UpgradeScreen = function(dialog) {731  goog.ui.OfflineInstallDialog.InstallScreen.call(this, dialog,732      goog.ui.OfflineInstallDialog.UpgradeScreen.TYPE);733  /**734   * @desc The description of the the upgrade step to perform in order to enable735   *     offline access.736   * @hidden737   */738  var MSG_OFFLINE_DIALOG_INSTALL_NEW_GEARS = goog.getMsg(739      'Install a new version of Gears');740  /**741   * Override to say upgrade instead of install.742   * @type {string}743   * @protected744   * @suppress {underscore}745   */746  this.installMsg_ = MSG_OFFLINE_DIALOG_INSTALL_NEW_GEARS;747  /**748   * @desc Text of button that opens the download page for Gears for an749   *     upgrade.750   * @hidden751   */752  var MSG_OFFLINE_DIALOG_UPGRADE_GEARS =753      goog.getMsg('Upgrade Gears now');754  /**755   * Override the text on the button to show upgrade instead of install.756   * @type {string}757   * @protected758   * @suppress {underscore}759   */760  this.enableMsg_ = MSG_OFFLINE_DIALOG_UPGRADE_GEARS;761};762goog.inherits(goog.ui.OfflineInstallDialog.UpgradeScreen,763              goog.ui.OfflineInstallDialog.InstallScreen);764/**765 * The type of this screen.766 * @type {string}767 */768goog.ui.OfflineInstallDialog.UpgradeScreen.TYPE =769    goog.ui.OfflineInstallDialog.ScreenType.UPGRADE;770/**771 * Should upgrade button action be performed immediately when the user presses772 * the enter key anywhere on the dialog. This should be set to false if there773 * are other action handlers on the dialog that may stop propagation.774 * @type {boolean}775 * @protected776 */777goog.ui.OfflineInstallDialog.UpgradeScreen.prototype.isUpgradeButtonDefault =778    true;779/**780 * @return {goog.ui.Dialog.ButtonSet} The button set for the upgrade screen.781 * @override782 */783goog.ui.OfflineInstallDialog.UpgradeScreen.prototype.getButtonSet = function() {784  if (!this.buttonSet_) {785    /**786     * @desc Text of button that cancels setting up Offline.787     * @hidden788     */789    var MSG_OFFLINE_DIALOG_CANCEL_3 = goog.getMsg('Cancel');790    var buttonSet = this.buttonSet_ = new goog.ui.Dialog.ButtonSet(this.dom_);791    buttonSet.set(goog.ui.OfflineInstallDialog.ButtonKeyType.UPGRADE,792        this.enableMsg_, this.isUpgradeButtonDefault, false);793    buttonSet.set(goog.ui.OfflineInstallDialog.ButtonKeyType.CANCEL,794        MSG_OFFLINE_DIALOG_CANCEL_3, false, true);795  }796  return this.buttonSet_;797};798/**799 * Sets the upgrade description. This is the text before the upgrade steps.800 * @param {string} description  The upgrade description.801 */802goog.ui.OfflineInstallDialog.UpgradeScreen.prototype.setUpgradeDescription =803    function(description) {804  this.setInstallDescription(description);805};806/**807 * This screen is shown to users after the window to the Gears download page has808 * been opened.809 * @param {goog.ui.OfflineInstallDialog} dialog  The dialog this is a screen810 *     for.811 * @constructor812 * @extends {goog.ui.OfflineInstallDialogScreen}813 */814goog.ui.OfflineInstallDialog.InstallingGearsScreen = function(dialog) {815  goog.ui.OfflineInstallDialogScreen.call(this, dialog,816      goog.ui.OfflineInstallDialog.InstallingGearsScreen.TYPE);817};818goog.inherits(goog.ui.OfflineInstallDialog.InstallingGearsScreen,819              goog.ui.OfflineInstallDialogScreen);820/**821 * The type of this screen.822 * @type {string}823 */824goog.ui.OfflineInstallDialog.InstallingGearsScreen.TYPE =825    goog.ui.OfflineInstallDialog.ScreenType.INSTALLING_GEARS;826/**827 * The CSS className to use for bold text.828 * @type {string}829 * @private830 */831goog.ui.OfflineInstallDialog.InstallingGearsScreen.prototype.boldClassName_ =832    goog.getCssName('goog-offlinedialog-bold');833/**834 * Gets the button set for the dialog when the user is suposed to be installing835 * Gears.836 * @return {goog.ui.Dialog.ButtonSet} The button set.837 * @override838 */839goog.ui.OfflineInstallDialog.InstallingGearsScreen.prototype.getButtonSet =840    function() {841  if (!this.buttonSet_) {842    /**843     * @desc Text of button that closes the dialog.844     * @hidden845     */846    var MSG_OFFLINE_DIALOG_CLOSE = goog.getMsg('Close');847    var buttonSet = this.buttonSet_ =848        new goog.ui.Dialog.ButtonSet(this.dom_);849    buttonSet.set(goog.ui.OfflineInstallDialog.ButtonKeyType.CLOSE,850        MSG_OFFLINE_DIALOG_CLOSE, false, true);851  }852  return this.buttonSet_;853};854/**855 * Gets the content for the dialog when the user is suposed to be installing856 * Gears.857 * @return {string} The content of the dialog as html.858 * @override859 */860goog.ui.OfflineInstallDialog.InstallingGearsScreen.prototype.getContent =861    function() {862  if (!this.content_) {863    /**864     * @desc Congratulate the user for trying to download Google gears,865     *     and give them a push in the right direction.866     */867    var MSG_OFFLINE_DIALOG_GEARS_DOWNLOAD_OPEN = goog.getMsg(868        'Great! The Gears download page has been opened in a new ' +869        'window. If you accidentally closed it, you can {$aBegin}open the ' +870        'Gears download page again{$aEnd}.',871        {872          'aBegin': '<a ' + 'target="_blank" href="' +873              this.getDialog().getGearsDownloadPageUrl() + '">',874          'aEnd': '</a>'875        });876    /**877     * @desc Informs the user to come back to the the given site after878     *     installing Gears.879     * @hidden880     */881    var MSG_OFFLINE_DIALOG_GEARS_AFTER_INSTALL = goog.getMsg('After you\'ve ' +882        'downloaded and installed Gears, {$beginTag}restart your ' +883        'browser, and then come back to {$appUrl}!{$endTag}',884        {885          'beginTag': '<div class="' + this.boldClassName_ + '">',886          'endTag': '</div>', 'appUrl': this.getDialog().getAppUrl()887        });888    // Set the content.889    this.content_ = goog.string.buildString('<div>',890        MSG_OFFLINE_DIALOG_GEARS_DOWNLOAD_OPEN, '</div><br/><div>',891        MSG_OFFLINE_DIALOG_GEARS_AFTER_INSTALL, '</div>');892  }893  return this.content_;...

Full Screen

Full Screen

head.js

Source:head.js Github

copy

Full Screen

...237  installBlocked(installInfo) {238    ok(!!this.installBlockedCallback, "Shouldn't have been blocked by the whitelist");239    if (this.installBlockedCallback && this.installBlockedCallback(installInfo)) {240      this.installBlockedCallback = null;241      installInfo.install();242    } else {243      this.expectingCancelled = true;244      installInfo.installs.forEach(function(install) {245        install.cancel();246      });247      this.expectingCancelled = false;248      this.endTest();249    }250  },251  // nsIWindowMediatorListener252  onWindowTitleChange(window, title) {253  },254  onOpenWindow(window) {255    var domwindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)...

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run Airtest automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful